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에 주의할것

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()의 사용

x같은 시디즈 의자

http://www.sidiz.com/product/TN500HLDA/758 이 거지같은 시디즈 의자의 요추 받침은 척추를 압박해서 통증을 유발한다. 받침에 패드가 붙어있지만 그럼에도 제법 단단하다. 그 모서리 부분이 척추뼈의 한칸을 집중적으로 압박한다. ‘뭐냐 한놈만 패자 이거냐? ‘ 그런데 망할 요추 받침을 뒤로 확 밀어버릴수가 없다. 뺄수도 없다. 위아래로만 조정이 가능한데 어느쪽이든 척추뼈를 압박한다. 이게 나처럼 척추 전방전위증 증세가 있는 사람한테는 더더욱 신경쓰일수밖에 없다. … More x같은 시디즈 의자