2013-08-30 33 views
0

我想交錯頂點數據到標準矢量模板的STL容器。我已經成功地做到了這一點用OpenGL已經,我的網接口的源代碼都可以在網上對我的開源項目... https://github.com/RobertBColton/enigma-dev/blob/master/ENIGMAsystem/SHELL/Graphics_Systems/OpenGL3/GL3model.cppDirect3D 9.0交錯非fvf頂點緩衝區

現在我想使用的DirectX做同樣的方法,並已經成功地做到這一點部分是通過將我的FVF DWORD與我擁有的每個頂點的組件進行邏輯異或。然而,這是個什麼網目前呈現時,它僅包含頂點和法線爲... http://oi42.tinypic.com/2diq2dw.jpg

現在DX使這很難讓我做我在OGL做同樣的事情,我已經檢查,雙重檢查,並一遍又一遍地檢查,我的字節對齊在緩衝區內是完美的。我想要做的事情可以通過OpenGL維基解釋得更好...... /wiki/Vertex_Specification_Best_Practices#Formatting_VBO_Data

現在我不想實現一個着色器來完成這個任務。如果任何人都可以簡單地向我提供我正在嘗試做的任何指示,或者指示我在Direct3D 9中執行此操作的示例或教程的方向,它會真的幫助我,因爲這在DX中似乎不常見。

+0

如果您閱讀頂點規範的最佳實踐,它還會告訴您不要使用浮點顏色。 RGB float在舊硬件上是T&L友好的格式,但RGBA不是。 RGBA ubyte對T&L友好,並且佔用了1/4的存儲空間。 RGBA ubyte也是D3D用於D3DFVF_DIFFUSE等格式的格式,雖然它的格式是ARGB。 –

+0

嘿,謝謝你的迴應!但對於triangleCount,這不是三角形的數量,也就是按指數計算的元素數量,我認爲您在我的代碼部分中感到困惑。 OpenGL版本已經正常工作http://oi39.tinypic.com/2w53cqv.jpg。但是,感謝你提供的信息非常有用,你有什麼建議可以改變它,因爲我使用了一個類型爲gs_scalar的向量(代表圖形系統標量,默認爲float)? – Goombert

+0

我會做的是使用std :: vector 而不是std :: vector 。這是交錯格式的常用方法。像struct {float pos [3]; float normal [3]; DWORD顏色; float tex_st [2]; } // < - D3D9 ... D3D有一個宏,可以用來將浮點顏色打包成一個DWORD,D3DCOLOR_COLORVALUE(r,g,b,a)'。使用適合頂點顏色的格式和數據類型('GL_BGRA','GL_UNISNGED_BYTE'),您也應該可以在OpenGL中互操作地使用這種數據結構。 –

回答

2

的你正在嘗試做的仔細檢查之後,我相信這是你想要什麼:

D3DVERTEXELEMENT9 custom_vertex [] = 
{ 
    { 0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0 }, 
    { 0, 12, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_NORMAL, 0 }, 
    { 0, 24, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0 }, 
    { 0, 32, D3DDECLTYPE_D3DCOLOR, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_COLOR, 0 }, 
    D3DDECL_END() 
}; 

這個數據結構的格式非常類似於OpenGL的頂點指針系統,你必須通過在偏移量中,組件的大小和數量(例如D3DDECLTYPE_FLOAT3)。您還包括該字段的用途(例如D3DDECLUSAGE_COLOR)。與OpenGL不同,D3D可以簡單地通過使用D3DDECL_END()宏來計算步幅。

IDirect3DVertexDeclaration9* vertex_declaration; 
d3dDevice->CreateVertexDeclaration (custom_vertex, &vertex_declaration); 

現在你應該很好去使用這個聲明來創建和填充你的頂點緩衝區。您可以通過使用不同的D3DVERTEXELEMENT9數組來添加/刪除元素。

請記住使用DWORD(D3D)或4 ubyte(OpenGL)顏色。 90%的時間沒有理由使用浮點顏色。他們只是浪費存儲和內存帶寬。

+0

哦,你是最好的人!除了帶顏色值的模型沒有得到正確的字母,我的代碼現在可以在線獲得DirectX版本了https://github.com/RobertBColton/enigma-dev/blob/master/ENIGMAsystem/SHELL /Graphics_Systems/Direct3D9/DX9model.cpp – Goombert

+0

這就是DirectX版本的樣子http://oi40.tinypic.com/or54kx.jpg – Goombert

+0

這是它在OpenGL http://oi39.tinypic中的樣子。 COM/2w53cqv.jpg – Goombert

相關問題