카메라 렌더링 버그 - Viewport

  1. 문제 상황



1. 문제

Mesh UI를 구현하던 중, 메쉬가 카메라에 제대로 렌더링되지 않는 문제가 발생함.

  • 카메라와 메쉬 오브젝트의 위치가 정확히 일치할 때만 부분적으로 렌더링됨.

  • 카메라에 렌더링된 부분 또한 왜곡되어 렌더링되었음.


Mesh UI 에서 메쉬를 카메라로 프리뷰하는 기능은 다음과 같은 방법으로 구현하였다.

  • Mesh UI 클래스는 프리뷰할 메쉬를 찍을 m_MeshCam 오브젝트와 메쉬를 가지고 렌더링될 m_VertexObject 를 소유하며, 카메라로 찍은 결과를 렌더링할 렌더 타겟 텍스쳐와 깊이 스텐실 텍스쳐를 멤버로 보유하고 있다.

  • 300*300 픽셀 사이즈의 렌더 타겟과 깊이 스텐실 텍스쳐를 객체 생성 시 생성한다.

  1. UI 활성화 시, ImGui의 렌더 타겟을 임시 저장하고 멤버로 가지고 있던 렌더 타겟 및 깊이 스텐실 텍스처를 Output Merge 에 타겟으로 세팅한다.

  2. 렌더링 전, 각 텍스쳐를 클리어시킨다.

  3. m_VertexObject의 렌더 컴포넌트에 메쉬를 세팅하고, 머테리얼의 상수값을 필요시 세팅한다.

  4. m_MeshCam, m_VertexObject의 Final Tick을 호출하고, m_MeshCam의 카메라 컴포넌트의 Render 함수를 호출한다.

  5. 임시 저장한 ImGui의 렌더 타겟을 다시 세팅해 원상복구 시킨다.

  6. ImGui 이미지 UI에 렌더 타겟의 SRV를 전달해서 렌더링한다.




2. 해결

결론부터 말하자면, Viewport 설정의 문제였다.

정점과 인덱스 버퍼 IA에 전달, 정점 및 픽셀 셰이더 바인딩, 렌더 타겟 준비 및 교체 등 전부 잘 수행했지만, 렌더 타겟을 세팅할 때 Resterizer State 의 뷰포트 설정을 빼먹었다.

부분적으로, 정확히 일치할 때만, 왜곡되어 렌더링 된 이유는 기존 뷰포트 해상도인 1920*1080 해상도에서 렌더 타겟 300*300 해상도에 렌더링되느라 NDC 좌표가 틀어졌고, 실제 투영 좌표 변화량이 너무 커 렌더 범위 바깥으로 나가버린 것으로 추정된다.


렌더 타겟 교체시 뷰포트 설정도 꼭 하자