2011-12-29 15 views
1

私はDirectX Documentation/Referenceのようなチュートリアルやリソースを拝見しましたが、何か逃したか、私の質問に対する答えが見つからないかのどちらかです。DirectXはどのようにして頂点を読み込みますか?

質問がタイトルに記載されています:DirectXはどのようにVerticesをVertex Bufferに読み込むのですか?

私はもちろん、1つ以上のFVFコードを提供する必要があることを理解しました。しかし、Vertex構造体を正しく設定する方法はどこにも言及していません。私が想像できる唯一のことは、もちろんDirectXはフラグを線形のタイムラインでチェックするので、同じデータ型と命令を必要とするかもしれないフラグが構造体の先頭に来る必要があります。 !私が何を意味するかについてはほとんど例として

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

= FVFコードと

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

D3DFVF_XYZ | D3DFVF_NORMAL 

nxnynz 3Dを表現します通常の頂点の座標。

正しく頂点構造体が評価されて設定する方法上の任意のヘルプ...敬具

Derija

答えて

1

あなたは、C++やHLSL構造を確保する必要があるためと一致しますそれはVertex Formatで指定されていました(あなたが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'、 'POSITION'(セマンティクスを使用しますどの構造体がどこに行くのかを知るために、CPUからGPUに書き込まれるときDirectX doe ) – alwynd

+0

vert declはD3D10 +の機能ではなく、9で導入されて優先され、10で必要になったことに注意してください.FVFよりはるかに柔軟です(FVFで可能なこと実際に作成する必要があります。 – ssube

+0

あなたの答えをありがとう。それは私の質問をとてもうまく解決しました。 @peachykeen:ありがとうございました。私が現在使っている詳細なチュートリアルを提供しているウェブサイトは、DX9から始まります。そこでは、基本の大部分が扱われます。 DX10と11は、ウェブサイトの別々の部門で処理され、基本的な知識に多くのものを追加するので、私はかなりウェブサイトがこれも同様に言うと確信しています。 – Kiruse

関連する問題