D3D12엔진개발- Render Target의 Post Processing

가로 세로 7샘플씩, x축으로 한번, y축으로 한번씩 blur를 먹이는 blur filter를 구현했다. laplacian filter를 적용해서 outline을 검출하는 필터도 구현했다. D3D9나 D3D11에선 별것도 아닌 기능이지만 D3D12에서 구현하는건 그리 간단하지는 않았다. 예를 들어 BLUR를 보자. Original Image -> Resize -> Blur X -> Blur Y 이 순서로 가야하는데 D3D12이전에는 Original Image ->  Resize – (wait for complete) ->  Blur X … More D3D12엔진개발- Render Target의 Post Processing

D3D12엔진개발-CommandList 사용 실수

밖이 워낙 추우니 일단 집밖으로 나가기 싫은지라 추운 방에서 떨면서 작업을 했다. 현재 Post-effect를 적용하진 않았지만 준비는 다 끝났다. 아웃라인을 처리하기 위한 Normal과 Depth, 오브젝트 타입별 ID를 저장하는 별도의 렌더타겟 버퍼들을 만들고 렌더링하고 직접 눈으로 볼 수 있도록 했다. 그 외에 glow와 dof를 적용하기 위한 준비도 끝냈다. 그 와중에 너무 잘 돌아가는게 이상하다 싶어 Graphics Debugging을 … More D3D12엔진개발-CommandList 사용 실수

D3D12엔진개발 – Shadow Map등 멀티패스 렌더링의 효율적인 처리

CommandList와 CommandQueue를 이용한 Batch Processing은 멋지다. D3D12는 모든 작업을 CommandList에 기록하고 나중에 CommandQueue에서 여러개의 CommandList를 한번에 execute한다. 그림자 처리를 예로 들면 ShadowMap생성을 위한 Caster Object렌더링과 그림자를 받는 Receiver Object의 렌더링 사이에 wait가 필요없다. 이런식으로 그 모든 작업을 한방에 처리. 게다가 어플리케이션은 execute()결과가 완료될때까지 딴짓을 해도 된다. // Execute the command list. UINT CommandListCount = 0; … More D3D12엔진개발 – Shadow Map등 멀티패스 렌더링의 효율적인 처리

D3D12엔진개발-Cascade Shadow Map

뷰포인트 기준으로 거리에 따라 4단계의 Cascade Shadow Map을 적용했다. 이전 포스팅에서 언급했던것처럼 Shadow Map으로부터 SRV를 설정한 descriptor handle을 미리 준비해둔다. 오브젝트 렌더링시에 shadow적용을 받는 경우 오브젝트의 Descriptor Table의 Shadow Map영역에 Shadow Map의 descriptor을 CopyDescriptorsSimple()함수로 카피한다. shadow적용을 받지 않는 경우는 1×1사이즈의 white텍스쳐의 Descriptor를 카피한다. Shadow Map생성을 위해 shadow caster오브젝트들을 렌더링할땐 별도의 ID3D12GraphicsCommandList를 사용하므로 반사처리라든가 등등 pre-rendering하는 … More D3D12엔진개발-Cascade Shadow Map

D3D12엔진 개발 – 디버깅을 위한 Depth buffer 렌더링

요 몇 일간 Toon-Table Texture를 적용해서 아웃라인을 제외한 Toon Shading을 가능하도록 했다. 이제 그림자를 처리하려고 한다.그림자 처리를 위해 Shadow Map에 씬을 렌더링 해야한다. 그 전에 할 일이 있다. Render Target으로 사용한 텍스쳐를 화면에 렌더링 할 수 있도록 해야한다. 디버깅을 위해서 이 기능은 필수다. Shadow Map은 물론 snow처리나 Mirror효과, Out-line, Glow등의 Post Processing을 구현할때도 Render Target을 화면에 출력하는 기능이 꼭 … More D3D12엔진 개발 – 디버깅을 위한 Depth buffer 렌더링

D3D12-ID3D12Device::CopyDescriptorsSimple()의 사용

D3D11에서 ID3D11ShaderResourceView포인터를 얻어와서 텍스쳐로 사용하던것과 비슷하게 처리하려면 D3D12에선 ID3D12Device::CopyDescriptorsSimple()을 사용하면 된다. CreateShaderResourceView()로 세팅한 Descriptor를 현재 렌더링에 사용할 Descriptor Table로 카피하면 됨. 주의사항은 source로 사용할 Descriptor는 non-shader visible descriptor 여야한다. 즉 DescriptorHeap을 만들때 다음과 같히 하면 된다. D3D12_DESCRIPTOR_HEAP_DESC commonHeapDesc = {}; commonHeapDesc.NumDescriptors = dwMaxCount; commonHeapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV; commonHeapDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_NONE; // for non-shader visible descriptor if … More D3D12-ID3D12Device::CopyDescriptorsSimple()의 사용

D3D12엔진 – Descriptor Table구조 예시

개발중인 D3D12엔진에서 사용하는 Descriptor Table구조다. 예를 들어 두개의 텍스쳐를 사용하고 있는 오브젝트 한개가 있다. 두개의 텍스쳐-매터리얼을 가지고 있으므로 렌더링은 두번 나눠서 해야한다. 하지만 두개의 그룹-Facegroup이라 부르겠다-은 월드상에서 동일한 Transform Matrix를 사용해서 렌더링한다. 따라서 Transform Matrix와 같이 공통적으로 사용할 수 있는 리소스의 경우 한번만 설정하고 변경없이 두번 렌더링 하면 된다. 두개의 FaceGroup이 공통적으로 사용할 리소스는 Projection을 위한 matrix, Shadow … More D3D12엔진 – Descriptor Table구조 예시

D3D12엔진 진행상황 – 본격 3D model 렌더링

폰트와 스프라이트는 xy평면에 Projection된것으로 간주하기 때문에 Vertex구조와  constant buffer구조가 간단하다. 그래서 쉽게 처리했다. 이번에 처리한 오브젝트 타입은 캐릭터를 비롯해서 Light map을 사용하지 않는 모든 오브젝트에 범용적으로 사용하는-나는 VLMeshObject라 부른다-범용 오브젝트라 Vertex구조와 constant buffer구조가 매우 복잡하다. 덕분에 descriptor table설정하는데 상당히 시간을 보냈다. 그랬는데 렌더링이 안됨. 안될뿐 아니라 VS2015의 Graphics Debugging으로 돌려보면 d3d12에러가 발생함. 전혀 엉뚱하게 IASetVertexBuffer에서 command … More D3D12엔진 진행상황 – 본격 3D model 렌더링

D3D12에서 변경된 Resource관리 체계 요약

cuda와 같은 GPGPU API처럼 D3D12에선 GPU의 Virtual Address를 직접 노출하고 있다. offset조작을 통해서 할당받은 Virtual Address범위 안에서는 자유롭게 사용하도록 하고 있다. 기존 API에서 ConstantBuffer,Texture등의 그래픽스 용어로 감추었던 추상화를 크게 제거했다. [ID3D12Resource] GPU와 메모리와 시스템메모리가 짝으로 이루어진 연속된 Memory Block. cuda로 치면 cudaMalloc()과 cudaMallocHost()를 짝으로 할당해서 객체화시킨것이다. [Descriptor] 해당 메모리가 어떤 타입의 리소스로 사용될것인지, 시스템메모리 어드레스와 GPU메모리 어드레스를 … More D3D12에서 변경된 Resource관리 체계 요약