最近系統的學習Direct3D,
從DXSDK的例子學起。在Tut02_Vertices例子中,自定義頂點格式為:
struct CUSTOMVERTEX
{
FLOAT x, y, z, rhw;
DWORD color;
//D3DXCOLOR color;
};
// 初始化頂點數據
CUSTOMVERTEX vertices[] =
{
{ 150.0f, 50.0f, 0.5f, 1.0f, D3DXCOLOR(1.0f, 0.0f, 0.0f, 0.0f)/*0xffff0000*/, }, // x, y, z, rhw, color
{ 250.0f, 250.0f, 0.5f, 1.0f, D3DXCOLOR(0.0f, 1.0f, 0.0f, 0.0f)/*0xff00ff00*/, },
{ 50.0f, 250.0f, 0.5f, 1.0f, D3DXCOLOR(0.0f, 0.0f, 1.0f, 0.0f)/*0xff00ffff*/, },
};
自定義格式結構體中注釋掉的是我后來想用的D3DXCOLOR。原本以為將原先定義的DWORD顏色換成D3DXCOLOR類型,然后初始化的時候相應做替換就可以了,誰知道,渲染出來的三角形頂點顏色異常:

正常的應該是這樣

百思不得其解,郁悶至極。后來終于在GameDev.net上找到近似案例(這里),琢磨一番,恍然大悟。
原來,在FVF頂點格式中,D3D需要特定的內存布局,就是說,你的頂點格式中各項的類型應該滿足它的期望。比如,它要求的顏色值應該是DWORD類型的32位整數值,而替換成D3DXCOLOR之后,卻變成了4個float類型值(r, g, b,a),與其期望不符,所以導致了異常的顏色。頂點結構體中顏色值還是換回DWORD類型,代碼中的賦值可以正常使用,因為D3DXCOLOR有到DWORD的自動轉換。