2011-12-29 72 views
1

所以我瀏覽了一些教程和資源,比如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

回答

1

您需要確保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