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관리 체계 요약

D3D12엔진 개발-폰트 렌더링, Texture에 실시간으로 써넣기

D3D12용 폰트 렌더링 코드를 작성했다. 오래전부터 써온 방식인데 D3D9, D3D11, D3D12에 따라서 구현은 달라질수밖에 없다. 근간 전략은  동일 내용의 텍스트에 대해서는 텍스쳐로 만들어두고 최대한 재활용한다는 것이다. 즉 “ABCDEF”라는 문자열을 같은 폰트로 렌더링 하는 경우 첫번째 렌더링 시에는 GDI나 DWrite를 이용해 렌더링하고 그걸로 텍스쳐에 써넣지만, 두번때 렌더링시에는 이미 만들어진 텍스쳐와 그 좌표를 캐시로부터 얻어온다. 이 전략을 이전부터 … More D3D12엔진 개발-폰트 렌더링, Texture에 실시간으로 써넣기

D3D12에서 Texture의 Row Pitch구하기.

D3D11에선 Map()한번으로 리소스로 사용하는 메모리의 RowPitch를 얻을 수 있었는데 D3D12에선 Map()해봐야 포인터 하나 달랑 나옴. ‘SystemMemory에 잡는 리소스의 경우 Pitch가 따로 없이 Width x SierPerPixel로 딱 맞아떨어지는 것인가! 그래서 CopyResource()할때 알아서 해주는 것인가!’ 라고 생각했으나 UpdateSubresources()소스 코드를 따라가보니 RowPitch를 구해서 카피하고 있다. 역시 그런 자동화 따위 있을리가 있나. 게다가 수동제어를 전면에 내세운 D3D12에서… 하여간 텍스쳐에 … More D3D12에서 Texture의 Row Pitch구하기.

D3D12 – ConstantBuffer, Descriptor Heap의 pooling

D3D12 엔진 개발상황 스프라이트 한개를 가지고 위치를 바꿔가며 찍을 수 있게 됐다. 스샷참고. 같은 스프라이트를(캐릭터 모델의경우도 마찬가지) 위치 바꿔가며 여러번 렌더링한다는게 D3D12에선 간단하지가 않다. D3D11은 즉시 상태를 바꾸로 렌더링하고 그 응답을 받고 다음을 진행한다. 하지만 D3D12는 배치처리를 한다. Command를 레코딩해서 마지막에 Execute하는 방식이라 이전처럼 한개의 ConstantBuffer를 잡아놓고 내용 고쳐써가며 렌더링을 여러번 할 수 없다. 스샷 참고. … More D3D12 – ConstantBuffer, Descriptor Heap의 pooling

D3D12 멀티 텍스쳐링 샘플

슬프게도 github에 개인이 올린 CreateDDSTextureFromFile의 d3d12버전이 제대로 작동하지 않음. d3d12샘플의 miniengine소스에서 긁어다가CreateDDSTextureFromFile()함수 다시 만듦. 1 ConstantBufferView와 2 ShaderResourceView를 하나의 디스크립터힙에 몰아넣어서 RootSignagture로 세팅했다. 리소스 바인딩에 대해서 이제 어느 정도 감 잡았다. … 파일에서 하나 읽고 메모리에서 하나 생성해서 멀티텍스쳐링 예제 만들어서 돌려봤다.