입력 어셈블러 단계 시작
IA(입력 어셈블러) 단계를 초기화하는 데 필요한 몇 가지 단계가 있습니다. 예를 들어 파이프라인에 필요한 꼭짓점 데이터를 사용하여 버퍼 리소스를 만들고, 버퍼가 어디에 있는지, 어떤 데이터 형식을 포함하는지 IA 단계에 알리고, 데이터에서 어셈블할 기본 형식을 지정해야 합니다.
다음 표에 나와 있는 IA 단계 설정과 관련된 기본 단계는 이 항목에서 다룹니다.
단계 | 설명 |
---|---|
입력 버퍼 만들기 | 입력 꼭짓점 데이터를 사용하여 입력 버퍼를 만들고 초기화합니다. |
입력 레이아웃 개체 만들기 | 입력 레이아웃 개체를 사용하여 꼭짓점 버퍼 데이터를 IA 단계로 스트리밍하는 방법을 정의합니다. |
입력 어셈블러 단계에 개체 바인딩 | 생성된 개체(입력 버퍼 및 입력 레이아웃 개체)를 IA 단계에 바인딩합니다. |
기본 형식 지정 | 꼭짓점을 기본 형식으로 어셈블하는 방법을 식별합니다. |
호출 그리기 메서드 | 파이프라인을 통해 IA 단계에 바인딩된 데이터를 보냅니다. |
이러한 단계를 이해한 후 시스템 생성 값 사용으로 이동합니다.
입력 버퍼 만들기
입력 버퍼에는 꼭짓점 버퍼와 인덱스 버퍼의 두 가지 유형이 있습니다. 꼭짓점 버퍼는 IA 단계에 꼭짓점 데이터를 제공합니다. 인덱스 버퍼는 선택 사항입니다. 꼭짓점 버퍼의 꼭짓점 인덱스를 제공합니다. 하나 이상의 꼭짓점 버퍼와 선택적으로 인덱스 버퍼를 만들 수 있습니다.
버퍼 리소스를 만든 후에는 IA 단계에 대한 데이터 레이아웃을 설명하는 입력 레이아웃 개체를 만든 다음 버퍼 리소스를 IA 단계에 바인딩해야 합니다. 셰이더가 버퍼를 사용하지 않는 경우 버퍼를 만들고 바인딩할 필요가 없습니다. 단일 삼각형을 그리는 간단한 꼭짓점 및 픽셀 셰이더의 예는 버퍼 없이 입력 어셈블러 스테이지 사용을 참조 하세요.
꼭짓점 버퍼를 만드는 방법에 대한 도움말은 방법: 꼭짓점 버퍼 만들기를 참조하세요. 인덱스 버퍼를 만드는 방법에 대한 도움말은 방법: 인덱스 버퍼 만들기를 참조하세요.
입력 레이아웃 개체 만들기
입력 레이아웃 개체는 IA 단계의 입력 상태를 캡슐화합니다. 여기에는 IA 단계에 바인딩된 입력 데이터에 대한 설명이 포함됩니다. 데이터는 하나 이상의 꼭짓점 버퍼에서 메모리에서 IA 단계로 스트리밍됩니다. 설명은 하나 이상의 꼭짓점 버퍼에서 바인딩된 입력 데이터를 식별하고 런타임에 셰이더 입력 매개 변수 형식에 대해 입력 데이터 형식을 검사 수 있는 기능을 제공합니다. 이 형식 검사 형식이 호환되는지 확인할 뿐만 아니라 셰이더에 필요한 각 요소를 버퍼 리소스에서 사용할 수 있는지도 확인합니다.
입력 레이아웃 개체는 입력 요소 설명 배열과 컴파일된 셰이더에 대한 포인터에서 만들어집니다(ID3D11Device::CreateInputLayout 참조). 배열에는 하나 이상의 입력 요소가 포함됩니다. 각 입력 요소는 단일 꼭짓점 버퍼의 단일 꼭짓점 데이터 요소를 설명합니다. 전체 입력 요소 설명 집합은 IA 단계에 바인딩될 모든 꼭짓점 버퍼의 모든 꼭짓점 데이터 요소를 설명합니다.
다음 레이아웃 설명에서는 세 가지 꼭짓점 데이터 요소를 포함하는 단일 꼭짓점 버퍼에 대해 설명합니다.
D3D11_INPUT_ELEMENT_DESC layout[] =
{
{ L"POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0,
D3D11_INPUT_PER_VERTEX_DATA, 0 },
{ L"TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 12,
D3D11_INPUT_PER_VERTEX_DATA, 0 },
{ L"NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 20,
D3D11_INPUT_PER_VERTEX_DATA, 0 },
};
입력 요소 설명은 크기, 형식, 위치 및 용도를 포함하여 꼭짓점 버퍼의 단일 꼭짓점이 포함하는 각 요소를 설명합니다. 각 행은 의미 체계, 의미 체계 인덱스 및 데이터 형식을 사용하여 데이터 형식을 식별합니다. 의미 체계는 데이터를 사용하는 방법을 식별하는 텍스트 문자열입니다. 이 예제에서 첫 번째 행은 3개 구성 요소 위치 데이터(예: xyz)를 식별하고, 두 번째 행은 2개 구성 요소 텍스처 데이터(예: UV)를 식별하고, 세 번째 행은 일반 데이터를 식별합니다.
입력 요소 설명의 이 예제에서는 세 행 모두에 대해 의미 체계 인덱스(두 번째 매개 변수)가 0으로 설정됩니다. 의미 체계 인덱스는 동일한 의미 체계를 사용하는 두 행을 구분하는 데 도움이 됩니다. 이 예제에는 유사한 의미 체계가 없으므로 의미 체계 인덱스를 기본값인 0으로 설정할 수 있습니다.
세 번째 매개 변수는 형식입니다. 형식(DXGI_FORMAT 참조)은 요소당 구성 요소 수와 각 요소의 데이터 크기를 정의하는 데이터 형식을 지정합니다. 리소스를 만들 때 형식을 완전히 입력하거나 요소의 구성 요소 수를 식별하지만 데이터 형식은 정의되지 않은 상태로 두는 DXGI_FORMAT 사용하여 리소스를 만들 수 있습니다.
입력 슬롯
데이터는 다음 그림과 같이 입력 슬롯이라는 입력을 통해 IA 단계로 들어갑니다. IA 단계에는 입력 데이터를 제공하는 최대 n개의 꼭짓점 버퍼를 수용하도록 설계된 n개의 입력 슬롯이 있습니다. 각 꼭짓점 버퍼는 다른 슬롯에 할당되어야 합니다. 이 정보는 입력 레이아웃 개체를 만들 때 입력 레이아웃 선언에 저장됩니다. 각 버퍼의 시작부터 읽을 버퍼의 첫 번째 요소까지 오프셋을 지정할 수도 있습니다.
다음 두 매개 변수는 입력 슬롯과 입력 오프셋입니다. 여러 버퍼를 사용하는 경우 하나 이상의 입력 슬롯에 바인딩할 수 있습니다. 입력 오프셋은 버퍼 시작과 데이터 시작 사이의 바이트 수입니다.
입력 레이아웃 개체 다시 사용
각 입력 레이아웃 개체는 셰이더 서명을 기반으로 만들어집니다. 이를 통해 API는 셰이더 입력 서명에 대해 input-layout-object 요소의 유효성을 검사하여 형식과 의미 체계가 정확히 일치하는지 확인할 수 있습니다. 모든 셰이더 입력 서명이 정확히 일치하는 한 많은 셰이더에 대해 단일 입력 레이아웃 개체를 만들 수 있습니다.
입력 어셈블러 단계에 개체 바인딩
꼭짓점 버퍼 리소스 및 입력 레이아웃 개체를 만든 후 ID3D11DeviceContext::IASetVertexBuffers 및 ID3D11DeviceContext::IASetInputLayout을 호출하여 IA 단계에 바인딩할 수 있습니다. 다음 예제에서는 단일 꼭짓점 버퍼와 입력 레이아웃 개체를 IA 단계에 바인딩하는 방법을 보여 드립니다.
UINT stride = sizeof( SimpleVertex );
UINT offset = 0;
g_pd3dDevice->IASetVertexBuffers(
0, // the first input slot for binding
1, // the number of buffers in the array
&g_pVertexBuffer, // the array of vertex buffers
&stride, // array of stride values, one for each buffer
&offset ); // array of offset values, one for each buffer
// Set the input layout
g_pd3dDevice->IASetInputLayout( g_pVertexLayout );
입력 레이아웃 개체를 바인딩하려면 개체에 대한 포인터만 있으면 됩니다.
앞의 예제에서는 단일 꼭짓점 버퍼가 바인딩됩니다. 그러나 ID3D11DeviceContext::IASetVertexBuffers에 대한 단일 호출로 여러 꼭짓점 버퍼를 바인딩할 수 있으며, 다음 코드에서는 세 개의 꼭짓점 버퍼를 바인딩하는 이러한 호출을 보여 줍니다.
UINT strides[3];
strides[0] = sizeof(SimpleVertex1);
strides[1] = sizeof(SimpleVertex2);
strides[2] = sizeof(SimpleVertex3);
UINT offsets[3] = { 0, 0, 0 };
g_pd3dDevice->IASetVertexBuffers(
0, //first input slot for binding
3, //number of buffers in the array
&g_pVertexBuffers, //array of three vertex buffers
&strides, //array of stride values, one for each buffer
&offsets ); //array of offset values, one for each buffer
인덱스 버퍼는 ID3D11DeviceContext::IASetIndexBuffer를 호출하여 IA 단계에 바인딩됩니다.
기본 형식 지정
입력 버퍼가 바인딩된 후 IA 단계에서 꼭짓점을 기본 형식으로 어셈블하는 방법을 설명해야 합니다. ID3D11DeviceContext::IASetPrimitiveTopology를 호출하여 기본 형식을 지정하여 이 작업을 수행합니다. 다음 코드는 이 함수를 호출하여 인접하지 않은 삼각형 목록으로 데이터를 정의합니다.
g_pd3dDevice->IASetPrimitiveTopology( D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST );
나머지 기본 형식은 D3D_PRIMITIVE_TOPOLOGY 나열됩니다.
호출 그리기 메서드
입력 리소스가 파이프라인에 바인딩된 후 애플리케이션은 그리기 메서드를 호출하여 기본 형식을 렌더링합니다. 다음 표에는 여러 그리기 메서드가 있습니다. 일부는 인덱스 버퍼를 사용하고, 일부는 인스턴스 데이터를 사용하고, 일부는 스트리밍 출력 단계의 데이터를 입력 어셈블러 단계에 대한 입력으로 재사용합니다.
그리기 메서드 | 설명 |
---|---|
ID3D11DeviceContext::Draw | 인덱싱되지 않은 인스턴스가 아닌 기본 형식을 그립니다. |
ID3D11DeviceContext::DrawInstanced | 인덱싱되지 않은 인스턴스 기본 형식을 그립니다. |
ID3D11DeviceContext::DrawIndexed | 인덱싱된 인스턴스가 아닌 기본 형식을 그립니다. |
ID3D11DeviceContext::DrawIndexedInstanced | 인덱싱된 인스턴스 기본 형식을 그립니다. |
ID3D11DeviceContext::DrawAuto | 스트리밍 출력 단계에서 가져온 입력 데이터에서 인덱싱되지 않은 인스턴스가 아닌 기본 형식을 그립니다. |
각 그리기 메서드는 단일 토폴로지 형식을 렌더링합니다. 렌더링하는 동안 불완전한 기본 형식(꼭짓점이 충분하지 않고 인덱스 부족, 부분 기본 형식 등)은 자동으로 해제됩니다카드.
관련 항목