여러개의 슬롯에 연결된 버텍스 버퍼를 렌더링 해보자. Vertex Buffer를 생성하는 문서에서 렌더링 파이프라인에 연결할 때 여러개의 정점 버퍼를 슬롯을 이용하여 동시에 연결할 수 있음을 잠깐 언급을 했었다.
여러개의 Vertex Buffer를 연결하기
여러개의 정점 버퍼를 렌더링 파이프라인에 연결하는 부분을 다시 한번 살펴보자.
ID3D11DeviceContext->IASetVertexBuffers( 0, 1, &g_pVertexBuffer, &stride, &offset );
정점 버퍼를 렌더링 파이프라인에 연결하는 이 함수의 자세한 명세는 다음과 같다.
virtual void STDMETHODCALLTYPE (
/* [annotation] */
_In_range_( 0, D3D11_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT - 1 ) UINT StartSlot,
/* [annotation] */
_In_range_( 0, D3D11_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT - StartSlot ) UINT NumBuffers,
/* [annotation] */
_In_reads_opt_(NumBuffers) ID3D11Buffer *const *ppVertexBuffers,
/* [annotation] */
_In_reads_opt_(NumBuffers) const UINT *pStrides,
/* [annotation] */
_In_reads_opt_(NumBuffers) const UINT *pOffsets) = 0;
함수 명세를 보면 정점 버퍼를 Input Assembly
스테이지에 최대 D3D11_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT
개까지 연결이 가능하다. 따라서 다음과 같이 정점 버퍼들을 렌더링 파이프라인에 연결할 수 있다.
ID3D11Buffer* VertexBuffers[ D3D11_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT ];
UINT Strides [ D3D11_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT ];
UINT Offsets [ D3D11_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT ];
ID3D11DeviceContext->IASetVertexBuffers( 0, D3D11_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT, VertexBuffers, Strides, Offsets );
이렇게 하면 연결 가능한 최대 개수의 정점 버퍼가 렌더링 파이프라인에 연결된다.
Vertex Buffer의 렌더링
정점 버퍼의 내용을 렌더링 하기 위해서 필요한 것들에 대해 이전 문서에서 살펴보았다. 여기에서 가장 중요한 것은 Input Assembly
스테이지 슬롯에 연결된 정점 버퍼마다 Input Layout
이 있어야 한다는 것이다. 정점 요소의 구조가 동일해도 슬롯마다 존재해야 한다.
D3D11_INPUT_ELEMENT_DESC에서 보면 특성을 지정할때 Input Assembly
의 슬롯을 지정할 수 있도록 되어 있다.
D3D11_INPUT_ELEMENT_DESC elementsSlot0[] =
{
{ "SV_POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },
{ "COLOR", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 },
}
D3D11_INPUT_ELEMENT_DESC elementsSlot1[] =
{
{ "SV_POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 1, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },
{ "COLOR", 0, DXGI_FORMAT_R32G32B32_FLOAT, 1, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 },
}
각 슬롯의 D3D11_INPUT_ELEMENT_DESC
데이터 준비
D3D11_INPUT_ELEMENT_DESC배열에서 각 요소들의 슬롯이 섞이면 안됨
SV_POSITION
과 COLOR
의 IA
슬롯이 서로 다르다면 일단 동작은 하나 정상적인 동작이 기대되지 않는다. 하나의 배열에서 설명하는 각 특성 요소들의 슬롯은 동일하게 셋팅되어야 올바른 동작이 보장된다.
ID3D11InputLayout* InputLayoutSlot0 = nullptr;
ID3D11InputLayout* InputLayoutSlot1 = nullptr;
D3D11Device->CreateInputLayout( &elementsSlot0[ 0 ], ARRAYSIZE( elementsSlot0 ), compiledShader->GetBufferPointer(), compiledShader->GetBufferSize(), InputLayoutSlot0 );
D3D11Device->CreateInputLayout( &elementsSlot1[ 0 ], ARRAYSIZE( elementsSlot1 ), compiledShader->GetBufferPointer(), compiledShader->GetBufferSize(), InputLayoutSlot0 );
2개의 슬롯에 대한 Input Layout
객체 생성
렌더링하기
이렇게 Input Layout
들이 모두 준비되면 Draw
하기전에 렌더링할 슬롯의 Input Layout
을 렌더링 파이프라인에 연결한 후 Draw
를 호출해주면 된다. Draw
를 호출하면 Input Layout
에 설정된 슬롯의 정점 버퍼로부터 정점의 요소들이 쉐이더로 스트리밍 된다.
D3D11DeviceContext->IASetInputLayout( InputLayoutSlot0 );
D3D11DeviceContext->Draw( 3, 0 );
D3D11DeviceContext->IASetInputLayout( InputLayoutSlot1 );
D3D11DeviceContext->Draw( 3, 0 );
슬롯마다 Draw
호출을 해주어야 한다. 이후 Present
를 호출해주면 다음과 같이 2개의 슬롯에 연결된 삼각형 정점 버퍼의 내용이 모두 렌더링 되는 것을 볼 수 있다.

이전글 : [DirectX11] 8. 삼각형 – Pixel Shader에 대해서 알아보자.
다음글 : [DirectX11] 10. 사각형 – Index Buffer에 대해 알아보자.