DirectX如何在顶点读取?

问题描述:

所以我浏览了一些教程和资源,比如DirectX文档/参考本身,或者我错过了一些东西,或者我真的找不到我的问题的答案。DirectX如何在顶点读取?

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

我明白,当然,你必须提供一个或多个FVF代码。但它并没有说任何地方如何正确设置你的顶点结构。我能想到的唯一的事情就是,当然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

您需要确保C++和HLSL结构,顺序相匹配,其中它是在顶点格式中指定的(如果您指定了XYZ,那么Normal,您的结构必须与此匹配),那么您需要使用device-> 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; 
}; 
+0

它基本上使用语义( '位置', 'TEXCOORD'等等。要知道什么结构在哪里,何时从CPU写入GPU,DirectX doe ) – alwynd 2012-01-03 08:05:15

+0

请注意,vert decls不是D3D10 +的特性,它们在9中被引入和优先使用,并在10中被需要。它们比FVF更灵活(允许FVFs可以做很多事情't),但确实需要实际创建。 – ssube 2012-01-03 08:33:06

+0

感谢您的回答。它很好地解决了我的问题。 @peachykeen:谢谢你的提示。提供我目前使用的详细教程的网站从DX9开始。在那里,大部分的基础知识都会被处理。 DX10和11由网站的不同部门负责,并在基础知识上添加更多内容,因此我确信某个地方的网站也会这样说。 – Kiruse 2012-01-07 20:00:56