2020년 7월 1일 수요일

DirectX - Instancing

정점 버터를 재사용해서 그리는 속도를 향상시키는 기법.

VertexBuffer 는 총 0 ~ 15개의 슬롯이 있고 그 중에 일부가 인스턴스 버퍼로써 사용이 가능함.

그래서 실질적으론 VertexBuffer 와 내용은 똑같고, D3D11_INPUT_ELEMENT_DESC 에서 조정만 하면 됨.

1

2

3

4

5

6

D3D11_INPUT_ELEMENT_DESC VertexPositionScale::descs[] =

{

{ "POSITION", 1, DXGI_FORMAT_R32G32B32_FLOAT, 1, 0, D3D11_INPUT_PER_INSTANCE_DATA, 1 },

{ "POSITION", 2, DXGI_FORMAT_R32G32B32_FLOAT, 1, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_INSTANCE_DATA, 1 },

};

Desc 의 내용을 위처럼 순서대로 정리하면

Semantic : hlsl 에서 쓰는 거.

Semantic Index : hlsl 에서 Semanic 옆에 0, 1, 2 적는 그거.

Format : 인자만 봐도 뭔지 쉽게 알 수 있는데, 들이 넣는 데이터 구조.

Input Slot : 이게 몇번째 VertexBuffer 에 들어가는지

AlignedByteOffset : 넣는 인자의 offset. 위에서 POSITION0 은 맨 앞에 있으니 당연히 오프셋 0, POSITION1 은 위의 인자가 자동으로 offset 을 계산해줌. 굳이 계산하면, 32비트 3개니까 12.

InputSlotClass : 인스턴싱은 여기가 핵심. D3D11_INPUT_PER_INSTANCE_DATA 넣으면 인스턴싱, D3D11_INPUT_PER_VERTEX_DATA 넣으면 그냥 정점

InstanceDataStepRate : 인스턴싱 데이터 하나마다 몇개 그릴건지 결정. 지금까지 0 또는 1만 써봤는데, 인스턴싱 버퍼 내부에선 통일되야지 맞는거 같기도하고... 아닌거 같기도 하고..

1

2

3

4

deviceContext->IASetVertexBuffers(slot, bufferCount, vertexBuffer[0], stride[0], vertexOffset[0]);

deviceContext->DrawIndexedInstanced(vertexCount, instanceCount, indexOffset, vertexOffset[0], vertexOffset[1]);

이렇게 버터 띄워놓고 DrawInstanced 나 DrawIndexedInstanced 함수로 그리면 됨.

댓글 없음:

댓글 쓰기

List