<aside> 💡
내가 다른 리소스들에 대해 사용할 Descriptor Heap 과 ImGui 가 사용할 Descriptor Heap 공간을 같은 걸 사용하게 하다보니 문제가 발생하였다.
ImGui 는 ImGui 가 사용할 Descriptor Heap 공간을 별도로 만들어주어야한다.
문제의 원인 발견과정은 하나하나 소거법으로 문제의 원인이 될만한 것들을 테스트 해나가다보니 ImGui 연동에서 문제가 생겼음을 알 수 있었다.
ImGui 초기화를 위해서 Descriptor Heap 을 넘겨준다는 점이 기억나면서 Descriptor Heap 할당관련 문제임을 알게되었다.
</aside>
<aside> 💡
SRV 리소스상에서 Texture[0] 에 해당하는 Albedo가 제대로 로딩이 되지않는 상황이었다. (나머지는 정상)
</aside>
<aside> 💡
그래서 이번에는 텍스쳐 로딩단계에서부터 문제가 생겼는지 점검하고자 하였다.
로딩 순서를 바꿔서 로드를 해보았다.
이전에는 Albedo 를 먼저 로드하고, Normal 두 번째로 로드하였는데
원인 파악을 위해 Normal 을 먼저 로드하고, Albeod 를 두 번째로 로드해보았다.
이렇게 하니 NormalMap 은 리소스가 정상적이지 않았고
AlbedoMap 은 리소스가 정상적으로 로딩이 되었다
이를 통해 알 수 있는 것은 맨 첫 번째 로딩할 때만 문제가 생긴다는 것이었다.
이후에 로딩하는 것은 전혀 문제없이 잘 동작하는 것이다.
ImGUI 가 내부적으로 로딩한 텍스쳐 리소스를 건드렸다던지, ImGUI 의 내부의 어떠한 동작에 의해 첫 번째 텍스쳐로딩단계에서 문제가 생기게 한다던지가 원인일 것이라 추정하였다.
ImGui 내부소스코드도 궁금해서 한 번 살펴보니, ImGUI 의 동작도 내 소스코드 동작과 크게 다르지 않게 DirectX12 를 초기화하고 RootSignature, PipelineState 설정하고, 리소스업데이트 및 바인딩하고, Fence로 CPU-GPU 작업동기화를 수행하였다.
ImGui 초기화 시에 Descriptor Heap 포인터를 내가 넘겨주었던 것도 확인할 수 있었다.
처음 ImGUI 를 연동할 당시에는 ImGUI 사용법에 따라 그냥 Renderer가 사용하던 DescriptorHeap 의 주소를 초기화시에 넘겨주면 ImGUI 가 알아서 문제가 없이 돌아갈 거라 생각했었는데 그게 원인인 것이었다.
이로인해, 내 Renderer 와 ImGUI 가 같은 Descriptor Heap 공간을 사용하게 되었고, ImGUI 가 Texture[0] 에 해당하는 공간을 덮어씌어 사용하면서 문제가 생긴것이었다.
이를 해결하기 위해서는 ImGUI 가 사용할 별도의 Descriptor Heap 공간을 마련해줘야만 하였다. </aside>
IBL 적용 전 Cook-Torrance BRDF 조명식만 적용
IBL + ImGui 적용 후 예기치 않은 결과
IBL + ImGui 적용 후 예기치 않은 결과