[DirectX11] 9. 여러개의 슬롯에 연결된 버텍스 버퍼를 렌더링 해보자.

여러개의 슬롯에 연결된 버텍스 버퍼를 렌더링 해보자. Vertex Buffer를 생성하는 문서에서 렌더링 파이프라인에 연결할 때 여러개의 정점 버퍼를 슬롯을 이용하여 동시에 연결할 수 있음을 잠깐 언급을 했었다.





여러개의 정점 버퍼를 렌더링 파이프라인에 연결하는 부분을 다시 한번 살펴보자.

C++
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;

함수 명세를 보면 정점 버퍼를 Input Assembly스테이지에 최대 D3D11_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT개까지 연결이 가능하다. 따라서 다음과 같이 정점 버퍼들을 렌더링 파이프라인에 연결할 수 있다.

C++
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 );

이렇게 하면 연결 가능한 최대 개수의 정점 버퍼가 렌더링 파이프라인에 연결된다.





정점 버퍼의 내용을 렌더링 하기 위해서 필요한 것들에 대해 이전 문서에서 살펴보았다. 여기에서 가장 중요한 것은 Input Assembly스테이지 슬롯에 연결된 정점 버퍼마다 Input Layout이 있어야 한다는 것이다. 정점 요소의 구조가 동일해도 슬롯마다 존재해야 한다.

D3D11_INPUT_ELEMENT_DESC에서 보면 특성을 지정할때 Input Assembly의 슬롯을 지정할 수 있도록 되어 있다.

C++
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 데이터 준비


C++
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에 설정된 슬롯의 정점 버퍼로부터 정점의 요소들이 쉐이더로 스트리밍 된다.

C++
D3D11DeviceContext->IASetInputLayout( InputLayoutSlot0 );
D3D11DeviceContext->Draw( 3, 0 );

D3D11DeviceContext->IASetInputLayout( InputLayoutSlot1 );
D3D11DeviceContext->Draw( 3, 0 );

슬롯마다 Draw호출을 해주어야 한다. 이후 Present를 호출해주면 다음과 같이 2개의 슬롯에 연결된 삼각형 정점 버퍼의 내용이 모두 렌더링 되는 것을 볼 수 있다.

Pasted image 20241210121534.png



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

Leave a Comment