D3D12엔진개발 – Hierachical z Map Occlusion Culling

D3D11버전에서 구현했던 Compute Shader를 이용한 Hi-Z Occlusion Culling을 D3D12엔진에서 구현했다. 기본 개념과 구현에 대해서는 자세히 적지 않겠다. 예전에 KASA에서 밝표했던 내용이 있으므로 발표자료를 첨부한다. Hierachical z Map Occlusion Culling from YEONG-CHEON YOU D3D12에서 Compute Shader를 사용하려면 어떤 API들을 사용해야하는지 찾느라 좀 애먹었다. Compute Shader를 위한 ID3DPipelineState를 만들려면D3D12_GRAPHICS_PIPELINE_STATE_DESC구조체 대신 D3D12_COMPUTE_PIPELINE_STATE_DESC를 사용해야한다. 또한 CreateGraphicsPipelineState()대신 ID3D12Device::CreateComputePipelineState()를 사용한다. 이거 … More D3D12엔진개발 – Hierachical z Map Occlusion Culling

D3D12엔진개발 – PipelineState 조합(폭발) 처리

D3D12렌더러 개발을 시작하면서 한번 언급했던 내용이다. PipelineState폭발. D3D12에선 Render State의 각 항목들을 개별적으로 바꿀 방법이 없다. 무슨 소린고 하니 A라는 VertexShader를 사용해서 렌더링했다가 모든 Render State를 그대로 유지한 상태에서 B라는 VertexShader로 바꿔서 렌더링하고 싶다…이런거 불가능하다. 알파블랜딩 상태도 마찬가지이고 Z-Write를 끌지 켤지, Z-Test를 할지 말지도 마찬가지다. 이 모든 상태들은 ID3D12PipelineState객체 한개로 묶어서 처리된다. D3D12_GRAPHICS_PIPELINE_STATE_DESC구조체 각 상태들을 설정해서 ID3D12PipelineState객체를 … More D3D12엔진개발 – PipelineState 조합(폭발) 처리

D3D12엔진개발 – Light Map Object를 위한 Texture Update

절대로 움직이지 않는 static한 오브젝트들은 Light Map을 사용한다. Graphics API를 사용하는 계층 말고 그 위의 상위 계층에서 Light Map의 좌표를 부여하고 각 Texel의 광도를 계산한다. 렌더러에서는 이미지 데이타로 받아서 Light Map Texture를 생성하고 렌더링할 뿐이다. 따라서 D3D11 -> D3D12로 전환되어도 Light Map처리 자체가 바뀌진 않는다. D3D Resource로서의 Light Texture 다루는 방법만 바뀔 뿐. Light Texture는 … More D3D12엔진개발 – Light Map Object를 위한 Texture Update

win32 or UWP에서 인터넷에 연결된 적절한 IP가져오기

요새는 머신에 여러개의 네트워크 장치가 붙어있다. 랜카드가 여러개인 경우도 있고, 그렇지 않더라도 VM등 가상 네트워크 디바이스가 여러개 존재하는 경우가 대부분이다. 따라서 어플리케이션이 접속을 받아야하는 경우에 어느 네트워크 장치의 IP에 bind해야할지 난감할때가 많다. 그래서 이럴때 사용할 코드를 작성했다. win32의 경우는 dns주소와 gateway가 설정된 경우를 찾아서 인터넷에 접속한걸로 간주한다. UWP의 경우 NetworkInformation::GetInternetConnectionProfile()로 인터넷에 연결된 네트워크 장치를 찾는다. … More win32 or UWP에서 인터넷에 연결된 적절한 IP가져오기

D3D12엔진개발 – ID3D12PipelineState폭발…

D3D12에선 온갖 렌더링 스테이트를 묶어서 ID3D12PipelineState객체 하나로 만들어둠. 렌더링하면서 렌더 스테이트를 중간에 바꿀수 있는 API가 아예 존재하지 않음. 오직 ID3D12PipelineState객체만 바꿔가면서 렌더링 할 수 있음. 이게 쉐이더 폭발보다 더 무서움. [ 알파블랜딩 경우의 수 x 쉐이더 조합의 경우의 수 x 기타(양면 렌더링 여부, Depth Enable, Depth Write여부 등등) ] 변수가 더 있을텐데 이 정도만 해도 … More D3D12엔진개발 – ID3D12PipelineState폭발…

D3D12엔진 개발 – D3D11엔진과의 성능비교

  이 날을 기다렸다. 실제로 정말 더 빠른지를 테스트해보고 싶었다. 일단 데스크탑의 경우 최대 프레임이 D3D12버전보다 D3D11쪽이 두배 정도 나왔다. 이건 상당히 아쉬운 부분인데 그냥 화면 클리어만 해도 D3D11보단 무조건 느리다. 데스크탑에서 D3D11버전이 1400프레임 정도 나올때 D3D12버전은 800프레임 정도다. 뭔가 드라이버쪽에서 개선해줄 필요가 있을것 같다. 노트북GPU에선 일단 D3D12쪽이 빠르다. GTX980M이 장착된 에일리언웨어 노트북에서 테스트했을때 D3D12버전쪽이 … More D3D12엔진 개발 – D3D11엔진과의 성능비교

D3D12엔진 개발 – Dynamic VertexBuffer 사용

Voxel Horizon데모를 D3D12엔진으로 돌아가게 만들었다. 데모에서 바닥과 블럭 렌더링은 Dynamic VertexBuffer를 사용한다. D3D11에선 Map(), Unmap()을 사용해서 하나의 VertexBuffer에 Update하고 Draw..(), 또 Update하고 Draw..()하면 되었다. D3D11이라고 해서 Draw..()한다고 즉시 렌더링이 이루어지진 않는데 Resource Renaming이란 방법으로 해결하고 있다. D3D12에선 이런거 없다. 게다가 CommandList를 이욯하기 때문에 Execute()하는 시점까진 Draw…()에 사용될 VertexBuffer의 내용이 그대로 유지되어야한다. 우선 Vertex Buffer는 다음과 … More D3D12엔진 개발 – Dynamic VertexBuffer 사용

D3D12엔진 개발 – ID3D12RootSignature 생성시 ref count에 주의할것

D3D12에서는 draw를 위한 각종 파라미터를 Descriptor Table로 전달한다. 그리고 이 Descriptor Table의 형식을 정의하는 것이 ID3D12RootSignature 오브젝트이다. ID3D12Device::CreateRootSignature()함수로 ID3D12RootSignature 객체를 생성한다. 그런데 여기서 주의할 점이 있다. ID3D12RootSignature* pRootSignature = NULL; HRESULT hr = m_pD3DDevice->CreateRootSignature(nodeMask,pBlobWithRootSignature,blobLengthInBytes,IID_PPV_ARGS(&pRootSignature)); 이와같이 ID3D12RootSignature 객체를 생성했을때 pRootSignature의 ref count는 1일거라고 생각하는 것이 일반적이다. 그런데 1보다 큰 숫자일 수 있다. 이 경우 pRootSignature의 어드레스를 확인해보면 이전에 생성했던 ID3D12RootSignature객체이다. 즉 D3D내부에서 … More D3D12엔진 개발 – ID3D12RootSignature 생성시 ref count에 주의할것