뭔가 렌더링 관련 얘기는 아닌데... 지금 포워드 렌더링에서 라이트를 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) 방법으로 했음.


결국 렌더링 처음에 한번만 세팅해주면 되는 라이트 정보는 메시 하나 렌더링할때마다 세팅 해주게 됐다... 제발 한 달 뒤라도 깔끔한 방법이 생각났으면 좋겠다.


렌더링이 되긴 됐지만 뭔가 된 것같지도 않고 찝찝하다.