디버깅 스토리 – DXR렌더러에 ABuffer를 이용한 OIT를 추가하고 나서 D3D Runtime crash 발생

어제 방송중 게임이 크래시했던 원인 찾았다. CPU코드에서 크래시한게 아니고 D3D런타임이나 드라이버, GPU하드웨어 큐에서 예외가 발생한 것인데 D3D Debug Runtime으로 돌리던게 아니었기 때문에 관련 에러 메시지는 전혀 확인할 수 없었다. 물론 덤프를 떠도 소용없지. CPU코드는 아무 문제 없이 잘 돌고 있었으니까.하루종일 고민 하다가 저녁먹고 본격적으로 뜯어보기 시작했는데 다행히 원인을 찾을 수 있었다. [원인] 최근에 이펙트의 반투명 … More 디버깅 스토리 – DXR렌더러에 ABuffer를 이용한 OIT를 추가하고 나서 D3D Runtime crash 발생

DXR – Update Acceleration Structure

건물 오브젝트에 이어 스키닝된 동적 매쉬들을 실시간으로 Acceleration Structure에 반영시켰다.Acceleration Structure 업데이트에 많은 비용이 들어갈걸로 추측하고 있기 때문에 일단 60FPS제한을 걸었다. 캐릭터 오브젝트의 변환(애니메이션, 위치, 스케일, 회전)을 Compute Shader에서 처리. 변환된 버텍스 데이터는 UAV로 전달된 ID3D12Resource에 저장. ID3D12Resource와 연관된 Bottom Level Acceleration Structure를 갱신. Top Level Acceleration Structure를 갱신. DXR의 가장 중요한 포인트는 ‘렌더링할 장면을 … More DXR – Update Acceleration Structure

D3D12예제에서 Constant Buffer를 System Memory에 두는 이유.

D3D12 예제를 보면 Constant Buffer를 system memory에 만들어 사용하고 있다. (CPU write, GPU read). D3D11에선 Constant Buffer를 GPU메모리에 두느냐, 시스템 메모리에 두느냐에 따라 성능차이가 꽤 난다. 20-30%정도는 차이가 나는것 같다. D3D12에서 테스트해보면 대략 10%정도 성능 차이가 난다. 당연히 GPU메모리에 두는 쪽이 빠르다. 크다면 크고 작다면 작은 수치다. 그럼 왜 D3D12예제에선 시스템 메모리에 Constant Buffer를 잡았을까. … More D3D12예제에서 Constant Buffer를 System Memory에 두는 이유.

DX12엔진에서 64KB Align문제 해결 – Texture

몇일전 포스팅 했다시피 DX12에선 모든 D3DResource가 64KB Align을 요구하고, 그래서 1Byte짜리 버퍼만 할당해도 64KB짜리가 할당된다. Voxel Horizon은 상당히 많은 개수의 Voxel-Object를 만들어내므로 DX12버전에선 GPU메모리를 미친듯이 먹고 있었다. 앞선 포스팅에서 언급했다시피 Vertex Buffer와 Index Buffer에 대해서는 직접 만든 heap에 64KB Align된 D3DResource를 결합해서 해결했다. 그리고 Texture가 남았다. 이게 처음에 좀 난감했다.  왜냐하면 1차원 버퍼가 아니고 2차원 … More DX12엔진에서 64KB Align문제 해결 – Texture

D3DResource(Buffer)를 heap에 맵핑해서 사용하기.

몇 번인가 언급한적 있는데 DX12에선 모든 리소스가 64KB얼라인을 사용한다. 이게 문제가 뭐냐면 4Bytes짜리 Vertex Buffer 한개를 만들어도 내부적으로 64KB짜리 버퍼가 할당된다. 처음부터 Vertex Buffer, Index Buffer를 많이 사용하는게 아니라면 별 문제가 아니지만 지금 진행중인 Voxel Horizon처럼 오브젝트를 2만개 이상 할당하는 경우는 크게 문제가 된다. 실제로 크게 문제가 됐다. DX11렌더러가 이미 잘 작동하고 있으므로 DX12렌더러를 그냥 … More D3DResource(Buffer)를 heap에 맵핑해서 사용하기.

DX11 vs DX12 리소스 사용량

어쩐지 무겁더라… Voxel Horizon의 DX12버전을 작업하던중 너무 무겁다고 생각했다. Project D Online의 dx12버전은 dx11버전에 비해 50%만(?) 메모리(GPU/GPU Mapped System Memory)를 더 먹었지만 Voxel Horizon프로젝트에선 8배를 더 처먹는다! Voxel Horizon은 정해진 맵데이터가 없는 대신 최대 8x8x8개의 복셀로 이루어진 수만개의 복셀 오브젝트가 존재한다. 복셀 오브젝트 한개당 Vertex Buffer 1개, Index Buffer 2개, Texture 1개를 만드는데 얘네들이 64KB얼라인이 … More DX11 vs DX12 리소스 사용량

Game Dev – Geometry Shader포기

처음 만들때 복셀 오브젝트의 디테일을 1x1x1부터 8x8x8까지 선택해가며 배치할 수 있게 했었다. 플레이어가 비교적 정밀한 구조물을 제작할 수 있게 하면서도 복셀의 구성 상태가 실제로 정밀하지 않다면 자동으로 1x1x1짜리 오브젝트로 변환하려고 이렇게 만들었다. 메모리를 아끼기 위해, 복셀의 구성상태는 bit-table을 사용한다. 8x8x8짜리 복셀오브젝트라면 복셀 한칸당 1비트를 할당해서 8x8x8 / 8 bytes의 bit-table을 만든다. 복셀의 컬러값은 따로 저장해두는데 … More Game Dev – Geometry Shader포기