3) Constant Buffer
Dx10에서 생긴 ‘Constant Buffer’는 ‘Shader’를 사용할 때 비효율적이고 지속적인 업데이트로 인해 성능을 떨어트리는 현상을 극복하기 위해 도입 되었습니다. 이를 이용해 API와 하드웨어가 상수를 효율적으로 조작해, 귀중한 GPU의 bandwidth와 CPU의 사용량을 최소화 할 수 있습니다.
Shader Constant들을 일괄적으로 관리해 shader constant data 를 관리하기 위해서 발생하는 bandwidth overhead 를 줄여 줍니다.
예전에는 constant 를 등록할 때 4개의 component 를 가진 상수를 등록하는게 기본이었습니다. 즉 float4 가 costanat 설정의 최소 단위였습니다. 하지만 이제는 float 하나만 등록하는 것이 가능합니다.
Shader-constant buffer의 생성은 이전 글에서 언급 했던 것처럼 ‘D3D11_BUFFER_DESC’의 BindFlags를 ‘D3D11_BIND_CONSTANT_BUFFER’로 설정하면 됩니다.
// Define the constant data used to communicate with shaders.
struct VS_CONSTANT_BUFFER
{
D3DXMATRIX mWorldViewProj;
D3DXVECTOR4 vSomeVectorThatMayBeNeededByASpecificShader;
float fSomeFloatThatMayBeNeededByASpecificShader;
float fTime;
float fSomeFloatThatMayBeNeededByASpecificShader2;
float fSomeFloatThatMayBeNeededByASpecificShader3;
};
D3D11_BUFFER_DESC BufDesc;
BufDesc.ByteWidth = sizeof( VS_CONSTANT_BUFFER );
BufDesc.BindFlags = D3D10_BIND_CONSTANT_BUFFER
그러나 Index, Vertex Buffer는 다른 ‘D3D11_BIND_CONSTANT_BUFFER’의 열거형 변수들과 함께 ‘or연산’으로 사용할 수 있으나 ‘D3D11_BIND_CONSTANT_BUFFER’는 다른 flag와 함께 사용 할 수 없습니다.
Shader-constant buffer 파이프라인에 bind할 때 아래 중 한 개를 사용합니다.
ID3D11DeviceContext::GSSetConstantBuffers,
ð ‘Geometry shader pipeline state’ 설정.
ID3D11DeviceContext::PSSetConstantBuffers,
ð ‘Pixel shader pipeline state’ 설정.
ID3D11DeviceContext::VSSetConstantBuffers
ð ‘Vertex shader pipeline state’ 설정.
쉐이더가 Shader-constant buffer를 읽게 하기 위해, 고유의 HLSL함수를 사용합니다.
실질적으로 DX10에서 DX11로 넘어오며 바뀐 점을 딱히 찾지는 못하고, Dx Help파일을 번역하고 검색한 내용을 약간 첨부한 정도가 되었습니다.
추후에 더 알게 되는 것이 있으면 추가하도록 하겠습니다.
'DirectX 11' 카테고리의 다른 글
[JumpToDX11-5] 새로운 시대를 여는 DirectX11... (6) | 2009.11.02 |
---|---|
[DX11_#3]기본적인 설정 (0) | 2009.10.22 |
[DX11_#1]D3D Buffer( 1 / 2 ) (0) | 2009.09.22 |
[JumpToDX11-4] ID3D11View (0) | 2009.09.07 |
[JumpToDX11-3] Feature Level (0) | 2009.08.31 |