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에 실시간으로 써넣기

Windows 10 디바이스간 파일전송앱 – FileTransfer

https://www.microsoft.com/en-us/store/apps/filetransfer/9nblggh1rmq5 예전 회사에서 만들었던 앱입니다. 로컬 네트워크 상의 Window 10 device간에 파일을 전송할 수 있는 앱입니다. UWP앱이고 당연히 Windows 10 Phone과 태블릿,PC를 모두 지원합니다. UI는 썰렁하지만 기능은 충실히 잘 작동합니다. 무엇보다 작고 빠릅니다. UWP앱으로는 무척 드믈게 C++와 winsock으로 만들었고 코어코드를 공유해서 win32콘솔버전도 개발했습니다. 물론 스토어에는 UWP버전만 올라갔죠. 제가 별5점을 준 리뷰가 한개 있긴 하지만… ‘The … More Windows 10 디바이스간 파일전송앱 – FileTransfer

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

Surface book 에서 CrystalDiskMark와 CrystalDiskInfo를 돌려보았다.

Surface book 에서 CrystalDiskMark와 CrystalDiskInfo를 돌려보았다. NVMe라 그런지 CrystamDiskInfo에선 디스크를 찾지 못한다.   디스크 디바이스 프로퍼티를 보면 NVMe SAMSUNG MZFLV256으로 나온다.   벤치마크는 정상수행 가능. 쓰기 속도가 약간 아쉬운 감이 있지만 읽기는 충분히 빠르다.     참고로 나의 오래된 데스크탑에서의 벤치마크 SAMSUNG SSD 830을 RAID 로 연결해서 쓰고있다. 구형장비지만 RAID덕에 그렇게 나쁘진 않다.