본문 바로가기
게임 공부/HLSL

[HLSL] #include를 통한 다른 셰이더 파일의 상수 버퍼 공유

by woohyeon 2021. 8. 9.
반응형

상수 버퍼(Constant Buffer)를 두 셰이더(VS, PS)에 동시에 설정하여도 모두 정상적으로 사용 가능한지 궁금해서 알아보고 있었다.

위의 답은 가능하다인데, 추가로 #include 기능을 통해 다른 셰이더에 선언된 상수 버퍼를 참조할 수 있다는 것도 알게 되었다. 즉 공유가 가능하다.

이를 위해선 다음과 같은 설정이 필요하다.

## 상수 버퍼 cb를 버텍스 셰이더 vs와 픽셀 셰이더 ps에서 공유하고 싶은 경우

먼저 vs에 평소처럼 cb를 선언한다. 그리고 동일한 레지스터 번호로 ps에도 선언한다. 이때 ps에는 멤버 변수를 선언하지 않는다. 즉 다음과 같이 한다.

// vertex shader
cbuffer cbMaxtrix : register(b0)
{
	float4x4 World;
	float4x4 WorldViewProjection;
};

// pixel shader
#include "vertexShader.hlsl"
cbuffer cbMaxtrix : register(b0)
{
};


멤버도 동일하게 선언하게 되면 이미 동일한 이름의 변수가 존재한다고 경고를 준다. 두 버퍼의 레지스터 번호(b0=b0)를 일치시키는 것이 중요하다. b1이라면 똑같이 b1으로.. 번호를 다르게 해도 실행이 되기 때문에 의도치 않은 버그를 발생시킬 수 있다. (이 때문에 반나절을 버렸다..)

cpp에선 동일하게 다음과 같이 두 셰이더 모두 상수 버퍼 설정 함수를 호출해 주어야 한다.

m_pDeviceContext->VSSetConstantBuffers(0, 1, ...);
m_pDeviceContext->PSSetConstantBuffers(0, 1, ...);

 

이후 ps에선 특별한 규칙없이 그냥 변수 이름 그대로 사용하면 된다.




댓글