Direct3D - Vertices and Input Layouts

顶点结构一般有两种表达方式:
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));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值