这个例子是展示如何渲染个三角形。
首先提到了一个概念顶点缓冲区,顾名思义专门用来存储顶点的缓冲区,要表示一个三角形则需要存储三个顶点。
顶点有很多属性,如法线,颜色等等。顶点的布局取决于它的属性如何放在内存里,顶点通常由一个struct表示。
struct SimpleVertex
{
XMFLOAT3 Pos; // Position
};
现在我们可以用这个结构来表示顶点。也就是缓冲区的每个节点都是这么一个结构,但是我们向gpu提供的是一个内存块,它必须知道我们顶点结构的布局是怎样的,不然它无法读出来。所以我们必须使用输入布局。输入布局对象是d3d对象。输入对象会将结构转换为gpu能理解的D3D11_INPUT_ELEMENT_DESC结构。D3D11_INPUT_ELEMENT_DESC的每个字段含义请看msdn。
D3D11_INPUT_ELEMENT_DESC layout[] =
{
{ "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },
};
UINT numElements = ARRAYSIZE(layout);
接下来是创建顶点布局对象,设置其为活动顶点布局。
// Create the input layout
if( FAILED( g_pd3dDevice->CreateInputLayout( layout, numElements, pVSBlob->GetBufferPointer(),
pVSBlob->GetBufferSize(), &g_pVertexLayout ) ) )
return FALSE;
// Set the input layout
g_pImmediateContext->IASetInputLayout( g_pVertexLayout );
创建并初始化顶点缓冲区,下面用3个顶点来初始化缓冲区,创建和初始化是同时工作的。最后再将其绑定到设备。
指定三角形列表,用来描述多个三角形。
g_pImmediateContext->IASetPrimitiveTopology( D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST );
执行渲染,使用两个渲染器,顶点渲染器和像素渲染器。前者用于将顶点转换为正确的位置,后者计算顶点最后输出的颜色。
// Render a triangle
g_pImmediateContext->VSSetShader( g_pVertexShader, NULL, 0 );
g_pImmediateContext->PSSetShader( g_pPixelShader, NULL, 0 );
g_pImmediateContext->Draw( 3, 0 );