저작물 참고 필자도 해당 내용을 공부하고 있는 입장으로 주로 오픈 문서, 포럼, AI 질의 응답을 활용하여 관련 내용을 공부하였습니다. 따라서 틀린 내용이 있을 수 있습니다.
다만, 타인(AI 등)의 저작물을 침해하지 않도록 순서, 과정, 스크린샷, 코드 등 다른 저작물을 활용 또는 포함하지 않았으며, AI 등 인터넷 자료는 오로지 기술 원리 이해의 목표로만 활용하고, 본 게시글에 언급된 과정, 흐름, 본문, 게시한 코드는 AI의 복붙 없이 모두 필자가 사전에 알고 있는 그래픽스 기술과 인터넷 상에 공개된 개념을 통해 모두 직접 시도하며 직접 작성하였음을 밝힙니다. 부득이하게 어떤 자료를 인용하는 경우는 링크로 출처를 남기고 인용합니다.
이전 게시글 https://whitmem.kr/read/527 에서 이어집니다.
본론부터 말하자면 이 부분이 제일 힘들었다... AI 질문을 해보아도 구버전 답변만 해주고, 어찌 저찌 새로운 Cull 을 하면 전체 크래시가 떠버려 프로그램이 응답 없음 꺼지는 증상이 발생했었다.
결과적으로 완전히 새로운 Cull을 만드는 것이 아니라 기존 cullResults 를 활용해서 특정 행렬에서 새로 렌더링하기로 하였다. 새로 Cull을 안 만들어도 됐던 이유는 어차피 화면 상에 보이는 객체들에 대해서만 그림자 맵 처리가 진행되면... 됐기 때문이다... (물론 미세하게 다른 부분이 있겠지만 말이다.)
RenderListDesc
화면상에 보이는 객체를 C# 스크립트에서 for 문으로 하나씩 렌더링 할 수 있겠지만 내부 C++ 호출이 아니기 때문에 성능 상 문제가 발생할 우려가 있다. 따라서 엔진이 제공하는대로 Cull 하여 CullResults 를 얻고 CullResults 에 대해서 일괄 출력 요청을 내부 엔진에 전송해야 한다.
Cull 이란 모든 객체를 바로 그래픽 라이브러리에 Draw Call 하는 경우 메시 개수에 따라 성능 문제가 발생할 수 있기 때문에, 우선 화면 절두체 범위 내에 들어오는 객체들만 뽑아내는 역할을 한다.
Cull OFF 되어 있으면 무조건 이 Cull Results에 들어올 것으로 보인다.
RendererListDesc desc = new RendererListDesc(new ShaderTagId("UniversalForward"), renderingData.cullResults, cameraData.camera);