最近系統(tǒng)的學(xué)習(xí)Direct3D,
從DXSDK的例子學(xué)起。在Tut02_Vertices例子中,自定義頂點(diǎn)格式為:
struct CUSTOMVERTEX
{
FLOAT x, y, z, rhw;
DWORD color;
//D3DXCOLOR color;
};
// 初始化頂點(diǎn)數(shù)據(jù)
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*/, },
};
自定義格式結(jié)構(gòu)體中注釋掉的是我后來(lái)想用的D3DXCOLOR。原本以為將原先定義的DWORD顏色換成D3DXCOLOR類型,然后初始化的時(shí)候相應(yīng)做替換就可以了,誰(shuí)知道,渲染出來(lái)的三角形頂點(diǎn)顏色異常:

正常的應(yīng)該是這樣

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