셰이더마다 사용하는 파라미터가 다를 것으로 예상돼서 셰이더마다 루트 시그니쳐를 만들고 있음.
그런데 지금은 초반이라 대부분의 셰이더가 파라미터를 공유하지만, 먼 미래에는 일부분은 공유하고 일부는 셰이더마다 추가적으로 필요한 파라미터가 있을 것 같음.
일부 파라미터를 공유하더라도 나머지 파라미터가 다르면 루트 시그니쳐를 따로 만들어줘야하는데, 공유되는 부분이 좀 아까움.
루트 시그니쳐를 교체할때마다 그에 맞도록 다시 커맨드 리스트에 파라미터를 세팅해줘야하는데, 공유하는 파라미터를 세팅하는 부분을 줄이고싶음.
루트 시그니쳐를 하나만 만드는 것도 생각해봤는데 이건 좀 아닌 것 같음.
완전히 파라미터를 공유하는 경우 말고, 위처럼 일부만 공유하는 경우 루트 시그니쳐를 최적화 할 수 있는 방법이 있는지 알고싶음.
그런건 없을라나...
뭔가 질문이 이상한것같은데 다시 생각해보겠음
그거 하나의 shader코드에다가 define으로 나누면됨 shader코드도 define으로 분기처리가능해서 그걸로 하면됨ㅇㅇ
?? 잘 이해가 안가는데 의사코드라도 대충 알려줄 수 있으신가요? shader 코드에서 뭘 분기 처리하라는건지 이해가 잘 안감...
루트 시그니쳐 자체를 최적화 할 수는 없지만 언리얼 엔진에 님이 말한것과 유사한 개념이 있습니다. 유니폼버퍼 라고 불리우는 기법인데요(glsl유니폼버퍼 아님), 각 셰이더마다 공용으로 사용하는 리소스집합을 정의하고 이를 공유합니다.
이때 각 셰이더마다 리소스 바인딩 슬롯이 달라질 수 있는데 이러한 부분은 리플렉션을 통하여 슬롯 정보를 추출하고 이에 맞는 루트 시그니쳐를 생성토록 합니다. 리플렉션구현은 그렇다 쳐도 언리얼엔진에선 셰이더 코드 자체를 프로그래밍적으로 생성해 내기 때문에 토이 프로젝트 수준에선 구현하기 빡셀수 있습니다
추가로 셰이더의 내용은 다르더라도 바인딩 되는 셰이더 타입들과 바인딩 슬롯 레이아이웃이 동일한 경우가 생길 수 있는데요, 이 경우에는 같은 루트시그니쳐를 사용할 수 있습니다.