DirectX11 – 여러개의 슬롯에 연결된 버텍스 버퍼 렌더링
여러개의 슬롯에 연결된 버텍스 버퍼를 렌더링 하려면 어떻게 해야할까?
Vertex Buffer를 생성하는 문서에서 렌더링 파이프라인에 연결할 때 여러개의 정점 버퍼를 슬롯을 이용하여 동시에 연결할 수 있음을 잠깐 언급을 했었다.
여러개의 Vertex Buffer를 연결하기
여러개의 정점 버퍼를 렌더링 파이프라인에 연결하는 부분을 다시 한번 살펴보자.
ID3D11DeviceContext->IASetVertexBuffers( 0, 1, &g_pVertexBuffer, &stride, &offset );
C++정점 버퍼를 렌더링 파이프라인에 연결하는 이 함수의 자세한 명세는 다음과 같다.
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;
C++함수 명세를 보면 정점 버퍼를 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 );
C++이렇게 하면 연결 가능한 최대 개수의 정점 버퍼가 렌더링 파이프라인에 연결된다.
Vertex Buffer의 렌더링
정점 버퍼의 내용을 렌더링 하기 위해서 필요한 것들에 대해 [DirectX11] 삼각형을 렌더링하기 위해 최소로 필요한 것에서 살펴보았다. 여기에서 가장 중요한 것은 Input Assembly
스테이지 슬롯에 연결된 정점 버퍼마다 Input Layout
이 있어야 한다는 것이다. 정점 요소의 구조가 동일해도 슬롯마다 존재해야 한다.
[DirectX11] Input Layout에서 보면 특성을 지정할때 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 },
}
C++각 슬롯의 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 );
C++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 );
C++슬롯마다 Draw
호출을 해주어야 한다. 이후 Present
를 호출해주면 다음과 같이 2개의 슬롯에 연결된 삼각형 정점 버퍼의 내용이 모두 렌더링 되는 것을 볼 수 있다.

이전글 : DirectX11 – Pixel Shader
다음글 : DirectX11 – Index Buffer
댓글을 남겨주세요
Want to join the discussion?Feel free to contribute!