DirectX如何读取顶点?

时间:2011-12-29 02:33:43

标签: directx structure vertexdata

所以我已经阅读了一些教程和资源,比如DirectX文档/参考本身,我错过了一些东西,或者我找不到问题的答案。

问题如标题所述:DirectX如何将顶点读入顶点缓冲区?

我当然明白你必须提供一个或多个FVF代码。但它并没有说任何地方如何正确设置你的Vertex结构。我唯一可以想象的是,DirectX检查线性“时间轴”中的标志,当然,因此一个可能需要相同数据类型和顺序的标志也必须首先出现在结构中。

作为我的意思的一个小例子:

struct MyVertex {
    float x, y, z;
    float nx, ny, ny;
};

!=

struct MyVertex {
    float nx, ny, nz;
    float x, y, z;
};

使用FVF代码:

D3DFVF_XYZ | D3DFVF_NORMAL

nxnynz代表普通顶点的3D坐标。

有关如何正确设置顶点结构的任何帮助都表示赞赏......

此致

Derija

1 个答案:

答案 0 :(得分:1)

您需要确保C ++和HLSL结构符合顶点格式中指定的顺序(如果您指定XYZ然后是Normal,您的结构必须与此匹配),那么您需要使用设备 - > CreateBuffer从顶点结构数组创建顶点缓冲区,之后可以释放和释放顶点结构数组,因为DirectX将独立于那里管理缓冲区数据,以改变渲染循环中的数据,缓冲区必须是可写,并且可以在使用ID3D10Buffer Map和Unmap创建后更新。

MSDN:
创建Vertexbufferm http://msdn.microsoft.com/en-us/library/windows/desktop/bb173544(v=vs.85).aspx 缓冲区:http://msdn.microsoft.com/en-us/library/windows/desktop/bb173510(v=vs.85).aspx

例如:C ++

D3D10_INPUT_ELEMENT_DESC layoutPosTexNormCInstanced[] = 
{
{"POSITION",     0, DXGI_FORMAT_R32G32B32_FLOAT,    0,  0, D3D10_INPUT_PER_VERTEX_DATA, 0},
{"TEXCOORD",     0, DXGI_FORMAT_R32G32_FLOAT,       0, 12, D3D10_INPUT_PER_VERTEX_DATA, 0},
{"NORMAL",       0, DXGI_FORMAT_R32G32B32_FLOAT,    0, 20, D3D10_INPUT_PER_VERTEX_DATA, 0},
{"TANGENT",      0, DXGI_FORMAT_R32G32B32_FLOAT,    0, 32, D3D10_INPUT_PER_VERTEX_DATA, 0},
{"BINORMAL",     0, DXGI_FORMAT_R32G32B32_FLOAT,    0, 44, D3D10_INPUT_PER_VERTEX_DATA, 0},
{"BLENDINDICES", 0, DXGI_FORMAT_R8G8B8A8_SINT,      0, 56, D3D10_INPUT_PER_VERTEX_DATA, 0 }, //4
{"mTransform",   0, DXGI_FORMAT_R32G32B32A32_FLOAT, 1,  0, D3D10_INPUT_PER_INSTANCE_DATA, 1 },
    {"mTransform",   1, DXGI_FORMAT_R32G32B32A32_FLOAT, 1, 16, D3D10_INPUT_PER_INSTANCE_DATA, 1 },
    {"mTransform",   2, DXGI_FORMAT_R32G32B32A32_FLOAT, 1, 32, D3D10_INPUT_PER_INSTANCE_DATA, 1 },
    {"mTransform",   3, DXGI_FORMAT_R32G32B32A32_FLOAT, 1, 48, D3D10_INPUT_PER_INSTANCE_DATA, 1 },
};


//Contains the position, texture coordinate and normal for lighting calculations.
struct DX10VertexNormal
{
//Constructor.
DX10VertexNormal()
{
    ZeroMemory(this, sizeof(DX10VertexNormal));
    boneIndex[0] = -1;
    boneIndex[1] = -1;
    boneIndex[2] = -1;
    boneIndex[3] = -1;
};

//PAD to 4.
D3DXVECTOR3 pos;
D3DXVECTOR2 tcoord;
D3DXVECTOR3 normal;
D3DXVECTOR3 tangent;
D3DXVECTOR3 binormal;
int boneIndex[4];

};

HLSL:

///Holds the vertex shader data for rendering 
///instanced mesh data, with position, texture coord, 
///and surface normal for lighting calculations.
struct VS_Instanced_PosTexNorm_INPUT
{
  float4 Pos: POSITION;
  float2 Tex: TEXCOORD;
  float3 Norm: NORMAL;
  float3 Tangent: TANGENT;
  float3 Binormal: BINORMAL;
  int4 boneIndex: BLENDINDICES;
  row_major float4x4 mTransform : mTransform;
  uint InstanceId : SV_InstanceID;
};