상수 버퍼(Constant Buffer)는 셰이더가 접근할 수 있는 다양한 자료를 저장하는 유연한 자료 블록이다. Direct3D의 자료를 셰이더로 넘겨줄 때 사용한다. 쉽게 설명해서, cpp상에서의 자료를 셰이더에서 사용할 수 있게 넘겨주는 버퍼이다.
상수 버퍼라고 해서 값을 변경하지 못 하는것은 아니다. 셰이더 내에서 충분히 값을 바꿀 수 있다. 상수라는 단어 때문에 값을 변경하지 못하고 cpp 시점에서 값이 고정된 자료라고 착각할 법 하다.
상수 버퍼는 내용을 얼마나 자주 갱싱할 것인지에 따라 상수 버퍼를 나누어 만드는 것이 좋다.
cbuffer cbPerObject
{
float4x4 gWVP;
};
cbuffer cbPerFrame
{
float3 gLightDirection;
float3 gLightPosition;
float4 gLightColor;
};
cbuffer cbRarely
{
float4 gFogColor;
float gFogStart;
float gFogEnd;
};
첫 상수 버퍼 cbPerObejct는 세계, 시야, 투영 행렬의 결합을 담고 있다. 이 변수는 물체에 따라 다르므로 물체마다 갱신해야 한다. 둘째 상수 버퍼는 장면 광원 정보를 담고 있다. 광원이 움직인다고 가정하면 매 프레임마다 갱신히야 한다. 마지막 상수 버퍼는 안개를 제어하는 변수들을 담고 있다. 안개가 변하지 않는다고 가정하면 처음 한 번만 갱신하면 된다.
상수 버퍼는 갱신할 때 그 상수 버퍼의 모든 변수들을 갱신해야 한다. 따라서 불필요한 갱신을 최소화하려면 변수들을 갱신 빈도에 따라서 나누어 만드는 것이 효율적이다.
728x90
'서적 정리 > DirectX11을 이용한 3D 게임 프로그래밍 입문' 카테고리의 다른 글
51.상자 예제 (0) | 2022.02.15 |
---|---|
50.효과 프레임워크(Effect Framework) (0) | 2022.02.10 |
49.렌더 상태(Render State) (0) | 2022.02.09 |
48.예제 픽셀 셰이더 (0) | 2022.02.08 |
46.예제 정점 셰이더 (0) | 2022.02.08 |
45.인덱스와 인덱스 버퍼(Index Buffer) (0) | 2022.02.08 |
44.정점 버퍼(Vertex Buffer) (0) | 2022.02.07 |
43.정점과 입력 배치 (0) | 2022.01.25 |
댓글