전체 글 118

ID3D11DeviceContext::Map 상황별 사용

GPU에서 쓴 정보를 CPU로 가져와서 읽을 때 Map // (GPU에서 써준)구조화 버퍼에 있는 본 정보 m_BoneBuffer를 m_BoneDataBuffer로 복사한다. CDevice::GetInst()->GetContext()->CopyResource(m_BoneDataBuffer, m_BoneBuffer->GetBuffer()); D3D11_MAPPED_SUBRESOURCEMap = {}; // D3D11_MAP타입의 3번째 인자는 D3D11_MAP_READ로 CDevice::GetInst()->GetContext()->Map(m_BoneDataBuffer->GetBuffer(), 0, D3D11_MAP_READ, 0, &Map); // m_vecBoneMatrix로 복사 memcpy(&m_ve..

디퍼드 렌더링(Deferred Rendering)에서 반투명한 물체를 위한 블렌딩처리가 안되는 이유

디퍼드 렌더링은 각 물체별로의 최종 색상(= 고유의 Diffuse Color에 Light를 적용한 색상)을 구하지 않고, 화면에 그려질 픽셀에 대해서만 최종 색상을 구한다. 블렌드는 결국 최종 색상끼리 블렌딩처리를 해야 하는데, 디퍼드 렌더링은 겹쳐지는 물체들의 픽셀에 그려지는 모든 최종 색상을 알 수 있는게 아니라 렌더 타겟에 존재하는 픽셀들의 최종 색상만 아는 것이다(디퍼드 렌더링은 화면 해상도 크기의 버퍼에 픽셀 별 최종 깊이 판정을 모두 거친, 빛을 받기 전 물체 고유한 색깔(=Diffuse Color)을 GBuffer에, Light들을 LightDiffuse, Light 모아둔다. 반투명 A 물체와 불투명 B 물체가 겹쳐지는 픽셀이 있는데 블렌딩 처리가 되려면 당연히 A물체의 최종 색상과 B물체..

DirectX 2D 포트폴리오 - 메이플 스토리 모작

Limitation - 저번 포트폴리오를 작업할때는 시간에 쫒겨서 작업하느라 이번에는 미리 할 수 있는 작업들은 미리미리 해놓고, 컨텐츠도 무리다 싶으면 과감하게 빼서 여유 있게 마무리해보자는 느낌으로 작업했는데 만들고 보니 생각보다 컨텐츠도 부족하고, 다른 분들의 결과물을 보니 많이 부족하다고 느낀다. 자쿰맵을 만들때 시간이 엄청 오래 걸릴 것으로 예상했는데 생각보다 그렇게 오래 걸리진 않아서 시간이 남으니 거기서 부터 계획이 좀 어긋났던것 같다. 이미 구현한 오브젝트 풀을 사용해봤는데 아무래도 엄청나게 많은 몬스터가 나와서 동시에 여러마리가 죽고 리젠되고 이런 상황이 아니다보니 오브젝트 풀을 써도 성능 개선이 거의 없는 것 같아서 아쉽다. 그리고 언리얼 공부의 중요성을 부쩍 느낀터라, 데드 라인까지 ..

포트폴리오 2022.04.18

렌더링 파이프라인(Rendering Pipeline)

렌더링 파이프라인을 검색해보면 두가지의 이미지를 발견할 수 있다. 사실 두개의 그림이 같은 내용인데 나는 다르다고 생각했다. Vertex Processing : Vertex Shader -> Hull Shader -> Tessellation -> Domain Shader -> Geometry Shader Rasterization : Rasterization Stage Fragment Processing : Pixel Shader Output Mering : Output Merger 위의 그림이 DX11기준 세분화한 것이고, 아래 그림에서는 Computer Graphics 기준에서 좀 더 포괄적인 의미의 그림이므로 이런 의미이므로 사실상 같은 내용이다 입력 조립기 단계 3D 모델 하나를 출력하기 위해선 3..

Particle 구현을 위한 Structured Buffer, Compute Shader 그리고 Geometry Shader

멀티쓰레드와 구조화버퍼를 이용해서 Compute Shader에서 파티클의 Alive 여부부터 Position, Color 등을 설정하고 Update할 수 있도록 했다. 아래 RWStructuredBuffer는 주석에서도 볼 수 있듯이 C++코드(CPU)에서가 아니라, 셰이더 코드(GPU)에서만 읽기/쓰기가 가능하게 하기 위해서 'RW'를 붙였고 C++코드에서 SRV(Shader Resource View)가 아니라 Unordered Access View(UAV)를 Set해줘야 한다. [numthreads(64, 1, 1)] 이라고 쓰여진 부분은 3차원 Cube를 생각했을때 x, y, z방향으로 각각 64개, 1개, 1개의 그룹을 만든다는 의미이고 64개에 분포되어 들어갈 쓰레드의 수는 C++코드에서 Com..

JPS(Jump Point Search) Algorithm

게임업계에서 길찾기 알고리즘에 많이 사용된다는 JPS알고리즘을 공부했다. JPS알고리즘은 A* 알고리즘과 유사하지만 대부분의 경우 A* 알고리즘보다 성능이 좋다고 한다. 우선 JPS의 핵심은 Jump Point를 찾는 것인데 그 Jump Point만 열린 목록에 넣고 A*에서 하듯이 비용을 검사한다. 당연히 A*처럼 가능한 모든 경로에 있는 노드들을 열린 목록에 넣고 검사하는 것이 아니라 비용이 더 적다. Jump Point를 찾는 방법은 2가지가 있는데 첫번째 방법은 Jumping Straight경우를 살펴보는 것이다. Jumping Straight Figure(a)가 Jumping Straight Case이다. p(x)는 x의 부모이다. p(x) 기준으로 상하좌우 중에서 오른쪽으로만 갈 수 있으니 오..

공부/Algorithm 2022.02.17

Windows에서의 동기화 기법

DirectX 공부를 하면서 게임을 만들고 있는데 멀티 쓰레드를 이용해서 로딩을 하기 위해 그에 대한 공부가 필요해져서 해보려고 한다. 사실 우리는 visual studio에서 이미 멀티 쓰레드 환경에서 프로그래밍을 하고 있다. Window환경에서의 쓰레드 생성을 위해 필요한 함수 // 새로운 쓰레드를 생성한다 // 1번째 인자는 자식 프로세스에 상속할때 설정해주는 구조체의 포인터 // 2번째 인자는 stack size. 0을 넘겨주면 자동으로 설정된다 // 3번째 인자는 생성한 쓰레드가 동작하게 될 함수 // 4번째인자는 생성한 쓰레드가 동작하게 될 함수에 넘겨줄 인자 // 마지막 인자에는 ThreadID를 받고 싶다면 unsigned int* 타입의 변수를 넣어두면 된다 uintptr_t _begin..

공부/운영체제 2022.01.22

CPU구조와 내부 구성요소들의 역할

CPU 동작 1. Fetch - 명령어 가져오기 2. Decode - 가져온 명령어 해독하기 3. Execute - 해독한 명령어를 실행 4. Writeback - 실행한 명령대로 (필요하다면)메모리에 쓰기 CPU 구성요소 ALU 실질적인 연산을 하는 장치. Adder(가산기)로 덧셈을, Complementer(보수기)로 뺄셈을, Shifter로 곱셈, 나눗셈을 할 수 있다. Control Unit 입력된 명령어를 Decoder를 이용해서 해독하고, 연산이 필요한 데이터를 메모리로부터 ALU로 옮기거나 역으로 ALU에서 계산된 결과를 메모리로 옮기는 명령을 내린다. 내부에 Bus Interface CPU가 외부에 데이터를 주고 받는 용도의 인터페이스. CPU 외부의 I/O Bus로부터 데이터를 주거나 받..