Dx11

[DirectX11] Vertex 버퍼 생성하기

겜도리도리 2023. 6. 9. 18:12
반응형

개요

DirectX11에서 Vertex 버퍼를 생성하는 방법에 대해 서술한다.

이 내용은 DirectX11을 이용한 3D게임 프로그래밍 입문의 내용을 읽고 정리했습니다.

 

Vertex 정보

사용자 지정 Vertex 형식을 만들려면 Vertex를 담을 구조체를 정의해야 한다.

구조체를 정의했다면, Vertex 구조체의 성분(필드)이 어떤 용도인지 Direct3D에게 알려주어야 한다.

ID3D11InputLayout 객체를 사용한다. 이 객체는 D3D11_INPUT_ELEMENT_DESC 구조체로 이뤄진 배열을 통해 구축한다. 구조체 성분이 두 개면, D3D11_INPUT_ELEMENT_DESC 배열의 원소도 두 개여야 한다.

 

D3D11_INPUT_ELEMENT_DESC 구조체의 성분은 다음과 같다.

 

SematicName : 성분에 부여된 문자열 이름이다.

SematicIndex : 의미소에 부여된 인덱스로, 인덱스가 지정되지 않으면 0인 의미소로 간주한다. 하나의 Vertex 구조체에 같은 성분이 여러 개 있는 경우 개별적인 의미소 이름을 부여하는 대신 index로 구별가능하게 할 수 있다.

Format : Vertex 성분의 자료 형식을 나타낸다.

InputSlot : Vertex 버퍼 슬롯의 인덱스이다. Direct3D는 16개의 Vertex 버퍼 슬롯을 지원한다.

AlignedByteOffset : 입력 슬롯을 하나만 사용하는 경우 Vertex 구조체의 시작 위치와 이 Vertex 성분의 시작 위치 사이 오프셋이다.

InputSlotClass : 일반적으로 D3D11_INPUT_PER_VERTEX_DATA를 지정한다.

InstanceDataStepRate : 일반적으로 0을 지정한다.

 

다음은 Postion과 Color 성분이 있는 Vertex 형식의 예제이다.

 

Vertex 정보를 설정했다면, CreateInputLayout 함수를 호출해서 InputLayout을 생성한다.

CreateInputLayout의 매개 변수는 다음과 같다.

 

pInputElementDesces : Vertex 구조체를 서술하는 D3D11_INPUT_ELEMENT_DESC 배열

NumElements : D3D11_INPUT_ELEMENT_DESC 배열의 원소 개수

pShaderBytecodeWithInputSignature : 바이트 코드를 가리키는 포인터

BytecodeLength : 바이트 코드의 크기

ppInputLayout : 생성된 InputLayout을 돌려주는 포인터

 

생성된 Input Layout은 Device에는 묶이지 않았으므로 IASetInputLayout을 사용해 Device에 묶어주어야 한다.

 

Vertex 버퍼

GPU가 Vertex 배열에 접근할 수 있으려면 Vertex를 버퍼에 담아 두어야 한다. Vertex를 담는 버퍼를 Vertex 버퍼라고 한다. Direct3D에서 버퍼는 ID3D11Buffer로 대표되고, 자료를 담으며, CPU나 GPU가 자료에 어떻게 접근할 수 있고 버퍼가 파이프 라인의 어디에 묶이는지에 대한 정보도 가진다.

 

Vertex 버퍼를 생성하려면 먼저 D3D11_BUFFER_DESC 구조체를 채워야 한다.

 

ByteWidth : 생성할 Vertex의 크기 (단위는 Byte)

Usage : 버퍼가 쓰이는 방식, GPU가 버퍼의 자원을 읽고 써야 하므로 D3D11_USAGE_DEFAULT를 사용한다.

BindFlags : Vertex 버퍼는 D3D11_BIND_VERTEX_BUFFER를 사용한다.

CPUAccessFlags : 버퍼 생성 이후 CPU가 버퍼를 읽거나 쓰지 않으므로 0을 지정한다.

MiscFlags : Vertex 버퍼는 사용할 필요가 없으므로 0을 지정한다.

StructureBtyeStride : structured 버퍼를 위해서만 사용하므로 0을 지정한다.

 

그 후에는 D3D11_SUBRESOURCE_DATA 구조체를 채워야 한다.

 

pSysMem : Vertex 버퍼를 초기화할 자료를 다은 시스템 메모리 배열을 가리키는 포인터이다.

SysMemPitch와 SysMemSlicePitch는 Vertex 버퍼에서는 사용되지 않는다.

 

마지막으로 CreateBuffer 함수를 호출해서 버퍼를 생성한다.

D3D11_BUFFER_DESC, D3D11_SUBRESOURCE_DATA  구조체를 채우고 CreateBuffer 함수를 호출하는 코드는 다음과 같다.

 

이렇게 생성된 버퍼의 정점들을 실제로 파이프 라인에 공급하려면, IASetVertexBuffer 함수를 사용해 버퍼를 Input Slot에 묶어야 한다.

 

StartSlot : Vertex 버퍼들을 붙이기 시작할 Input Slot의 인덱스. 0 ~ 15가 있다.

NumBuffers : Input Slot에 붙일 버퍼 개수

ppVertexBuffers : 붙일 Vertex 버퍼들을 담은 배열의 첫 원소를 가리키는 포인터

pStrides : Stride들의 배열의 첫 원소를 가리키는 포인터

pOffsets : 오프셋들의 배열의 첫 원소를 가리키는 포인터

 

Vertex를 입력 슬롯에 지정한 뒤에는 Draw 함수를 호출해주어야 한다.

 

반응형

'Dx11' 카테고리의 다른 글

[DirectX11] Index 버퍼 생성하기  (0) 2023.06.20
[DirectX11] DirectX11초기화  (0) 2023.05.31