카메라 렌더링 버그 - Viewport
- 문제 상황
1. 문제
Mesh UI를 구현하던 중, 메쉬가 카메라에 제대로 렌더링되지 않는 문제가 발생함.
-
카메라와 메쉬 오브젝트의 위치가 정확히 일치할 때만 부분적으로 렌더링됨.
-
카메라에 렌더링된 부분 또한 왜곡되어 렌더링되었음.
Mesh UI 에서 메쉬를 카메라로 프리뷰하는 기능은 다음과 같은 방법으로 구현하였다.
-
Mesh UI 클래스는 프리뷰할 메쉬를 찍을 m_MeshCam 오브젝트와 메쉬를 가지고 렌더링될 m_VertexObject 를 소유하며, 카메라로 찍은 결과를 렌더링할 렌더 타겟 텍스쳐와 깊이 스텐실 텍스쳐를 멤버로 보유하고 있다.
-
300*300 픽셀 사이즈의 렌더 타겟과 깊이 스텐실 텍스쳐를 객체 생성 시 생성한다.
-
UI 활성화 시, ImGui의 렌더 타겟을 임시 저장하고 멤버로 가지고 있던 렌더 타겟 및 깊이 스텐실 텍스처를 Output Merge 에 타겟으로 세팅한다.
-
렌더링 전, 각 텍스쳐를 클리어시킨다.
-
m_VertexObject의 렌더 컴포넌트에 메쉬를 세팅하고, 머테리얼의 상수값을 필요시 세팅한다.
-
m_MeshCam, m_VertexObject의 Final Tick을 호출하고, m_MeshCam의 카메라 컴포넌트의 Render 함수를 호출한다.
-
임시 저장한 ImGui의 렌더 타겟을 다시 세팅해 원상복구 시킨다.
-
ImGui 이미지 UI에 렌더 타겟의 SRV를 전달해서 렌더링한다.
2. 해결
결론부터 말하자면, Viewport 설정의 문제였다.
정점과 인덱스 버퍼 IA에 전달, 정점 및 픽셀 셰이더 바인딩, 렌더 타겟 준비 및 교체 등 전부 잘 수행했지만, 렌더 타겟을 세팅할 때 Resterizer State 의 뷰포트 설정을 빼먹었다.
부분적으로, 정확히 일치할 때만, 왜곡되어 렌더링 된 이유는 기존 뷰포트 해상도인 1920*1080 해상도에서 렌더 타겟 300*300 해상도에 렌더링되느라 NDC 좌표가 틀어졌고, 실제 투영 좌표 변화량이 너무 커 렌더 범위 바깥으로 나가버린 것으로 추정된다.
렌더 타겟 교체시 뷰포트 설정도 꼭 하자