뭔가 렌더링 관련 얘기는 아닌데... 지금 포워드 렌더링에서 라이트를 b0 레지스터로 넘겨줘야하는 상황이였음.
지금 렌더링 과정이
scene->Render()
camera->Render()
meshComponent->Render()
이런 구조임. 그리고 meshComponent의 Render()에서 루트 시그니쳐와 파이프라인 세팅, 디스크립터 힙 채우기를 함.
cbuffer에 넣을 라이트 정보는 scene에서 긁어야함. 그리고 라이트 정보는 한번 넣으면 변하지 않을거니까 힙 테이블이 아니라 루트 시그니쳐에 직접 디스크립터로 넣으려고 했음. 그런데 meshComponent의 Render()에서 루트 시그니쳐를 세팅하다보니까 루트 시그니쳐 세팅 전에 루트 파라미터의 디스크립터를 세팅하려고 하니 에러남.
(a) 루트 시그니쳐를 하나만 써서 RenderBegin에서 미리 세팅하든가
(b) 구조를 바꾸든가
(c) meshComponent의 Render()에서 라이트 정보를 얻어와서 세팅을 해야한다고 생각했음.
(a)는 먼 미래에 셰이더가 많아지면 너무 복잡해질 것 같아서 패스.
(b)는 scene, camera, meshComponent 순서의 Render 방식 말고 다른게 떠오르지 않아서 패스.
남은건 (c)인데,,, 라이트 정보를 어떻게 전달할까 고민해야했음.
여기서 생각한 방법이
(1) 라이트 정보를 파라미터로 전달(카메라 Render), 전달(meshComponent의 Render)해서 meshComponent의 Render에서 세팅.
(2) scene에서 라이트 정보를 어딘가에 저장해두고, meshComponent의 Render에서 scene의 포인터를 가져와서 라이트 정보를 가져오기.
(2)는 meshComponent의 Render()가 실행되는 시점에서 콜스택에 이미 scene의 함수가 있는데 다시 scene의 포인터를 다시 가져와서 라이트 정보를 얻어야한다는게 싫었음.
그래서 (1)을 고려해봤는데 뭔가 더 깔끔한 방법이 없을까 싶은거임. camera의 Render에 파라미터로 라이트를 넘겨주는게 맞을까. 좀 더 서로 독립된 코드를 작성할 순 없을까...
결국 모르겠다 ㅈㅈ치고 (1) 방법으로 했음.
결국 렌더링 처음에 한번만 세팅해주면 되는 라이트 정보는 메시 하나 렌더링할때마다 세팅 해주게 됐다... 제발 한 달 뒤라도 깔끔한 방법이 생각났으면 좋겠다.
렌더링이 되긴 됐지만 뭔가 된 것같지도 않고 찝찝하다.
Scene의 Render에서 라이트 정보를 가지고있는 배열을 싹 GPU 버퍼에 올리는건 어때
그러면 업로드(또는 업데이트)도 O(M*L) <M:렌더링할 메시 수, L:라이트 수>에서 O(1)으로 바뀌고
라이트 정보에 대한 업데이트
이런식으로 하면 렌더링 전에 Compute Shader상에서 light culling도 할 수 있을 것 같긴한데
Constant buffer 말고 Structured Buffer로
결국 포워드 렌더링 하는 셰이더의 루트 시그니쳐에 연결해야하는거 아닌가요..? 일단 지금은 셰이더에 따라 오브젝트 소팅하고 포워드 렌더링 하는 오브젝트만 따로 렌더링해서 루트 디스크립터로 라이트를 넣어주려고 합니다... 이러면 루트 시그니쳐에서 라이트는 한번만 넣어주면 될거고 나머지 파라미터는 메시에 따라서 변경될거니까요... 그런데 여전히 카메라에 매개변수 넘기는건 해결못하겠네요. 이젠 이게 해결해야하는 문제인가 싶기도 하고요.. 감사가 늦었네요. 주딱님 감사드립니다.