最近系统的学习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类型,然后初始化的时候相应做替换就可以了,谁知道,渲染出来的三角形顶点颜色异常:
![wrong.JPG](/images/cppblog_com/eros/wrong.JPG)
正常的应该是这样
![right.JPG](/images/cppblog_com/eros/right.JPG)
百思不得其解,郁闷至极。后来终于在GameDev.net上找到近似案例(这里),琢磨一番,恍然大悟。
原来,在FVF顶点格式中,D3D需要特定的内存布局,就是说,你的顶点格式中各项的类型应该满足它的期望。比如,它要求的颜色值应该是DWORD类型的32位整数值,而替换成D3DXCOLOR之后,却变成了4个float类型值(r, g, b,a),与其期望不符,所以导致了异常的颜色。顶点结构体中颜色值还是换回DWORD类型,代码中的赋值可以正常使用,因为D3DXCOLOR有到DWORD的自动转换。