버퍼 리소스 만들기(Direct3D 10)
버퍼를 만들려면 버퍼가 저장할 데이터를 정의하고, 초기화 데이터를 제공하고, 적절한 사용 및 바인딩 플래그를 설정해야 합니다. 텍스처를 만들려면 질감 리소스 만들기(Direct3D 10)를 참조하세요.
꼭짓점 버퍼 만들기
꼭짓점 버퍼를 만드는 단계는 다음과 같습니다.
버퍼 설명 만들기
꼭짓점 버퍼를 만들 때 버퍼 설명(D3D10_BUFFER_DESC 참조)을 사용하여 버퍼 내에서 데이터가 구성되는 방법, 파이프라인이 버퍼에 액세스할 수 있는 방법 및 버퍼 사용 방법을 정의합니다.
다음 예제에서는 위치 및 색 값을 포함하는 꼭짓점을 사용하여 단일 삼각형에 대한 버퍼 설명을 만드는 방법을 보여 줍니다.
struct SimpleVertex
{
D3DXVECTOR3 Position;
D3DXVECTOR3 Color;
};
D3D10_BUFFER_DESC bufferDesc;
bufferDesc.Usage = D3D10_USAGE_DEFAULT;
bufferDesc.ByteWidth = sizeof( SimpleVertex ) * 3;
bufferDesc.BindFlags = D3D10_BIND_VERTEX_BUFFER;
bufferDesc.CPUAccessFlags = 0;
bufferDesc.MiscFlags = 0;
이 예제에서 버퍼 설명은 사용, CPU 액세스 및 기타 플래그에 대한 거의 모든 기본 설정으로 초기화됩니다. 다른 설정은 리소스를 꼭짓점 버퍼로만 식별하는 바인딩 플래그 와 버퍼의 크기에 대한 것입니다.
사용량 및 CPU 액세스 플래그는 성능에 중요합니다. 이 두 플래그는 함께 리소스에 액세스하는 빈도, 리소스를 로드할 수 있는 메모리 유형 및 리소스에 액세스하는 데 필요한 프로세서를 결정합니다. 이 리소스의 기본 사용량은 자주 업데이트되지 않습니다. CPU 액세스를 0으로 설정하면 CPU가 리소스를 읽거나 쓸 필요가 없습니다. 즉, 리소스에 CPU 액세스가 필요하지 않으므로 런타임에서 GPU의 성능이 가장 높은 메모리에 리소스를 로드할 수 있습니다.
예상대로 최상의 성능과 두 프로세서의 모든 시간 접근성 간에 절충이 있습니다. 예를 들어 CPU 액세스가 없는 기본 사용량은 리소스를 GPU에서 단독으로 사용할 수 있음을 의미합니다. 여기에는 CPU에서 직접 액세스할 수 없는 메모리에 리소스를 로드하는 것이 포함될 수 있습니다. 리소스는 UpdateSubresource로만 수정할 수 있습니다.
버퍼에 대한 초기화 데이터 만들기
버퍼는 요소의 컬렉션일 뿐이며 1D 배열로 배치됩니다. 결과적으로 시스템 메모리 피치와 시스템 메모리 조각 피치는 모두 동일합니다. 꼭짓점 데이터 선언의 크기입니다. 애플리케이션은 실제 리소스 데이터에 대한 포인터를 포함하고 해당 데이터의 크기와 레이아웃에 대한 정보를 포함하는 하위 리소스 설명을 사용하여 버퍼를 만들 때 초기화 데이터를 제공할 수 있습니다.
변경할 수 없는 사용(D3D10_USAGE_IMMUTABLE 참조)으로 만든 버퍼는 생성 시 초기화해야 합니다. CopyResource, CopySubresourceRegion 및 UpdateSubresource를 사용하여 초기화한 후 또는 Map 메서드를 사용하여 기본 메모리에 액세스하여 다른 사용 플래그를 사용하는 버퍼를 업데이트할 수 있습니다.
버퍼 만들기
버퍼 설명 및 초기화 데이터(선택 사항)를 사용하여 CreateBuffer를 호출하여 꼭짓점 버퍼를 만듭니다. 다음 코드 조각은 애플리케이션에서 선언한 꼭짓점 데이터 배열에서 꼭짓점 버퍼를 만드는 방법을 보여 줍니다.
struct SimpleVertexCombined
{
D3DXVECTOR3 Pos;
D3DXVECTOR3 Col;
};
ID3D10InputLayout* g_pVertexLayout = NULL;
ID3D10Buffer* g_pVertexBuffer[2] = { NULL, NULL };
ID3D10Buffer* g_pIndexBuffer = NULL;
SimpleVertexCombined verticesCombo[] =
{
D3DXVECTOR3( 0.0f, 0.5f, 0.5f ),
D3DXVECTOR3( 0.0f, 0.0f, 0.5f ),
D3DXVECTOR3( 0.5f, -0.5f, 0.5f ),
D3DXVECTOR3( 0.5f, 0.0f, 0.0f ),
D3DXVECTOR3( -0.5f, -0.5f, 0.5f ),
D3DXVECTOR3( 0.0f, 0.5f, 0.0f ),
};
D3D10_BUFFER_DESC bufferDesc;
bufferDesc.Usage = D3D10_USAGE_DEFAULT;
bufferDesc.ByteWidth = sizeof( SimpleVertexCombined ) * 3;
bufferDesc.BindFlags = D3D10_BIND_VERTEX_BUFFER;
bufferDesc.CPUAccessFlags = 0;
bufferDesc.MiscFlags = 0;
D3D10_SUBRESOURCE_DATA InitData;
InitData.pSysMem = verticesCombo;
InitData.SysMemPitch = 0;
InitData.SysMemSlicePitch = 0;
hr = g_pd3dDevice->CreateBuffer( &bufferDesc, &InitData, &g_pVertexBuffer[0] );
인덱스 버퍼 만들기
인덱스 버퍼를 만드는 것은 꼭짓점 버퍼를 만드는 것과 매우 비슷합니다. 두 가지 차이점이 있습니다. 인덱스 버퍼에는 꼭짓점 버퍼에 사용할 수 있는 다양한 형식 대신 16비트 또는 32비트 데이터만 포함됩니다. 인덱스 버퍼에는 인덱스 버퍼 바인딩 플래그도 필요합니다.
다음 예제에서는 인덱스 데이터 배열에서 인덱스 버퍼를 만드는 방법을 보여 줍니다.
ID3D10Buffer *g_pIndexBuffer = NULL;
// Create indices
unsigned int indices[] = { 0, 1, 2 };
D3D10_BUFFER_DESC bufferDesc;
bufferDesc.Usage = D3D10_USAGE_DEFAULT;
bufferDesc.ByteWidth = sizeof( unsigned int ) * 3;
bufferDesc.BindFlags = D3D10_BIND_INDEX_BUFFER;
bufferDesc.CPUAccessFlags = 0;
bufferDesc.MiscFlags = 0;
D3D10_SUBRESOURCE_DATA InitData;
InitData.pSysMem = indices;
InitData.SysMemPitch = 0;
InitData.SysMemSlicePitch = 0;
hr = g_pd3dDevice->CreateBuffer( &bufferDesc, &InitData, &g_pIndexBuffer );
if( FAILED( hr ) )
return hr;
g_pd3dDevice->IASetIndexBuffer( g_pIndexBuffer, DXGI_FORMAT_R32_UINT, 0 );
상수 버퍼 만들기
Direct3D 10에는 상수 버퍼가 도입되었습니다. 상수 버퍼 또는 셰이더 상수 버퍼는 셰이더 상수가 포함된 버퍼입니다. 다음은 HLSLWithoutFX10 샘플에서 가져온 상수 버퍼를 만드는 예제입니다.
ID3D10Buffer* g_pConstantBuffer10 = NULL;
struct VS_CONSTANT_BUFFER
{
D3DXMATRIX mWorldViewProj; //mWorldViewProj will probably be global to all shaders in a project.
//It's a good idea not to move it around between shaders.
D3DXVECTOR4 vSomeVectorThatMayBeNeededByASpecificShader;
float fSomeFloatThatMayBeNeededByASpecificShader;
float fTime; //fTime may also be global to all shaders in a project.
float fSomeFloatThatMayBeNeededByASpecificShader2;
float fSomeFloatThatMayBeNeededByASpecificShader3;
};
D3D10_BUFFER_DESC cbDesc;
cbDesc.ByteWidth = sizeof( VS_CONSTANT_BUFFER );
cbDesc.Usage = D3D10_USAGE_DYNAMIC;
cbDesc.BindFlags = D3D10_BIND_CONSTANT_BUFFER;
cbDesc.CPUAccessFlags = D3D10_CPU_ACCESS_WRITE;
cbDesc.MiscFlags = 0;
hr = g_pd3dDevice->CreateBuffer( &cbDesc, NULL, &g_pConstantBuffer10 );
if( FAILED( hr ) )
return hr;
g_pd3dDevice->VSSetConstantBuffers( 0, 1, g_pConstantBuffer10 );
ID3D10Effect 인터페이스 인터페이스를 사용하는 경우 상수 버퍼를 만들고 바인딩하고 내보내는 프로세스는 ID3D10Effect 인터페이스 인스턴스에서 처리됩니다. 이 경우 GetVariableByName과 같은 GetVariable 메서드 중 하나를 사용하여 효과에서 변수를 가져와서 SetMatrix와 같은 SetVariable 메서드 중 하나로 변수를 업데이트하기만 하면 됩니다. ID3D10Effect 인터페이스를 사용하여 상수 버퍼를 관리하는 예제는 자습서 7: 질감 매핑 및 상수 버퍼를 참조하세요.
관련 항목