顶点结构一般有两种表达方式:
struct Vertex1
{
XMFLOAT3 Pos;
XMFLOAT3 Color;
};
struct Vertex2
{
XMFLOAT3 Pos;
XMFLOAT3 Normal;
XMFLOAT3 Tex0;
XMFLOAT3 Tex1;
}
对于定义的顶点类型,我们需要提供给Direct3D一个描述:
typedef struct D3D11_INPUT_ELEMENT_DESC
{
LPCSTR SemanticName;
UINT SemanticIndex;
DXGI_FORMAT Format;
UINT InputSlot;
UINT AlignedByteOffset;
D3D11_INPUT_CLASSIFICATION InputSlotClass;
UINT InstanceDataStepRate;
其中SemanticName表示一个标记的名字
SemanticIndex表示对于同一个标记名字的索引序列,就不必引入另一个标记名字了
Format表示所用的数据类型
InputSlot表示输入的slot的index,Direct3D一共支持16个slot,可以将不同的元素放在不同的slot里,也可以放在同一个里面
AlignedByteOffset表示在同一个slot里面,该元素的offset,比如对第一种顶点表达方式,如果将他们放在同一个slot里面,则需要将color的位置偏移,若pos的类型是DXGI_FORMAT_R32G32B32_FLOAT,则有32/8*4=16个byte,需要将color的offset设为16
InputSlotClass 目前只用D3D11_INPUT_PER_VERTEX_DATA
InstanceDataStepRate目前为1
所以,对于第二种表达方式,可以给出描述
D3D11_INPUT_ELEMENT_DESC desc2[] = {
{ "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0},
{ "NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 },
{ "TEXCOOR", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 24, D3D11_INPUT_PER_VERTEX_DATA, 0 },
{ "TEXCOORD", 1, DXGI_FORMAT_R32G32_FLOAT, 0, 32, D3D11_INPUT_PER_VERTEX_DATA, 0 },
};
然后可以获得一个指向ID3D11InputLayout接口的指针
HRESULT ID3D11Device::CreateInputLayout(
const D3D11_INPUT_ELEMENT_DESC *pInputElementDescs,
UINT NumElements,
const void *pShaderBytecodeWithInputSignature,
SIZE_T BytecodeLength,
ID3D11InputLayout **ppInputLayout);
pInputElementDescs就是描述顶点结构的D3D11_INPUT_ELEMENT_DESC 数组
NumElements表示D3D11_INPUT_ELEMENT_DESC 数组中的元素个数
BytecodeLength表示输入顶点shader的shader byte-code
BytecodeLength表示之前参数的byte size
ppInputLayout创建出来的输入layout的指针
创建方式如下:
D3D11_INPUT_ELEMENT_DESC vertexDesc[] =
{
{"POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0},
{"COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0}
};
// Create the input layout
D3DX11_PASS_DESC passDesc;
mTech->GetPassByIndex(0)->GetDesc(&passDesc);
HR(md3dDevice->CreateInputLayout(vertexDesc, 2, passDesc.pIAInputSignature,
passDesc.IAInputSignatureSize, &mInputLayout));