반응형
상수 버퍼(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에선 특별한 규칙없이 그냥 변수 이름 그대로 사용하면 된다.
'게임 공부 > HLSL' 카테고리의 다른 글
Geometry Shader Signature (0) | 2021.07.14 |
---|---|
기초적인 라이팅을 위한 정점 및 픽셀 셰이더를 작성해보자 (0) | 2021.03.12 |
댓글