방법: 꼭짓점 버퍼 만들기
꼭짓점 버퍼에는 꼭짓 점별 데이터가 포함됩니다. 이 항목에서는 정적 꼭짓점 버퍼, 즉 변경되지 않는 꼭짓점 버퍼를 초기화하는 방법을 보여줍니다. 비정적 버퍼를 초기화하는 데 도움이 되는 내용은 설명 섹션을 참조하세요 .
정적 꼭짓점 버퍼를 초기화하려면
- 꼭짓점을 설명하는 구조를 정의합니다. 예를 들어 꼭짓점 데이터에 위치 데이터 및 색 데이터가 포함된 경우 구조에는 위치를 설명하는 벡터 하나와 색을 설명하는 벡터가 있습니다.
- 1단계에서 정의한 구조체에 대한 메모리(malloc 또는 new 사용)를 할당합니다. 이 버퍼를 기하 도형을 설명하는 실제 꼭짓점 데이터로 채웁니다.
- D3D11_BUFFER_DESC 구조를 입력하여 버퍼 설명을 만듭니다. D3D11_BIND_VERTEX_BUFFER 플래그를 BindFlags 멤버에 전달하고 1단계에서 ByteWidth 멤버로 구조체의 크기를 전달합니다.
- D3D11_SUBRESOURCE_DATA 구조를 입력하여 하위 리소스 데이터 설명을 만듭니다. D3D11_SUBRESOURCE_DATA 구조체의 pSysMem 멤버는 2단계에서 만든 리소스 데이터를 직접 가리킵니다.
- 초기화할 ID3D11Buffer 인터페이스에 대한 D3D11_BUFFER_DESC 구조체, D3D11_SUBRESOURCE_DATA 구조체 및 포인터의 주소를 전달하면서 ID3D11Device::CreateBuffer를 호출합니다.
다음 코드 예제에서는 꼭짓점 버퍼를 만드는 방법을 보여 줍니다. 이 예제에서는 g_pd3dDevice 유효한 ID3D11Device 개체라고 가정합니다.
ID3D11Buffer* g_pVertexBuffer;
// Define the data-type that
// describes a vertex.
struct SimpleVertexCombined
{
XMFLOAT3 Pos;
XMFLOAT3 Col;
};
// Supply the actual vertex data.
SimpleVertexCombined verticesCombo[] =
{
XMFLOAT3( 0.0f, 0.5f, 0.5f ),
XMFLOAT3( 0.0f, 0.0f, 0.5f ),
XMFLOAT3( 0.5f, -0.5f, 0.5f ),
XMFLOAT3( 0.5f, 0.0f, 0.0f ),
XMFLOAT3( -0.5f, -0.5f, 0.5f ),
XMFLOAT3( 0.0f, 0.5f, 0.0f ),
};
// Fill in a buffer description.
D3D11_BUFFER_DESC bufferDesc;
bufferDesc.Usage = D3D11_USAGE_DEFAULT;
bufferDesc.ByteWidth = sizeof( SimpleVertexCombined ) * 3;
bufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
bufferDesc.CPUAccessFlags = 0;
bufferDesc.MiscFlags = 0;
// Fill in the subresource data.
D3D11_SUBRESOURCE_DATA InitData;
InitData.pSysMem = verticesCombo;
InitData.SysMemPitch = 0;
InitData.SysMemSlicePitch = 0;
// Create the vertex buffer.
hr = g_pd3dDevice->CreateBuffer( &bufferDesc, &InitData, &g_pVertexBuffer );
설명
시간이 지남에 따라 변경되는 꼭짓점 버퍼를 초기화하는 몇 가지 방법은 다음과 같습니다.
- D3D11_USAGE_STAGING 사용하여 두 번째 버퍼를 만듭니다. ID3D11DeviceContext::Map, ID3D11DeviceContext::Unmap;을 사용하여 두 번째 버퍼를 채웁니다. ID3D11DeviceContext::CopyResource를 사용하여 스테이징 버퍼에서 기본 버퍼로 복사합니다.
- ID3D11DeviceContext::UpdateSubresource를 사용하여 메모리에서 데이터를 복사합니다.
- D3D11_USAGE_DYNAMIC 사용하여 버퍼를 만들고 ID3D11DeviceContext::Map, ID3D11DeviceContext::Unmap(무시 및 NoOverwrite 플래그를 적절하게 사용)으로 채웁니다.
#1 및 #2는 프레임당 한 번 미만 변경되는 콘텐츠에 유용합니다. 일반적으로 GPU 읽기는 빠르며 CPU 업데이트는 느려집니다.
#3은 프레임당 두 번 이상 변경되는 콘텐츠에 유용합니다. 일반적으로 GPU 읽기는 느리지만 CPU 업데이트는 더 빠릅니다.
관련 항목