第四章
RGB数据可用两种不同的结构来保存,
*D3DCOLOR(DWORD类型相同)
要指定每个颜色分量值D3DCOLOR_ARGB ,D3DCOLOR_XRGB(#define D3DCOLOR_XRGB(r,g,b) D3DCOLOR_ARGB(0xff,r,g,b) )
*D3DCOLORVALUE (结构),该结构用单精度浮点数来度量每个颜色分量的亮度值,亮度值[0,1]0表示没有亮度,1表示亮度最大
typedef struct D3DCOLORVALUE{
float r;
float g;
float b;
float a;
}D3DCOLORVALUE;
可用D3DXCOLOR替代D3DCOLORVALUE,这两种结构可相互转换
typedef struct D3DXCOLOR{
#ifdef __cplusplus
public:
D3DXCOLOR(){}
D3DXCOLOR(DWORD argb);
D3DXCOLOR(CONST FLOAT*);
D3DXCOLOR(CONST D3DXFLOAT16*);
D3DXCOLOR(CONST D3DCOLORVALUE&);
D3DXCOLOR(FLOAT r,FLOAT g,FLOAT b,FLOAT a);
operator DWORD() const ;
...............
.........
#endif
FLOAT r,g,b,a;
}D3DXCOLOR,*LPD3DXCOLOR;
可将这两个结构表达成一个4D向量(r,g,b,a),
颜色向量的点积和叉积没有实际意义,但是对用分量相乘却是有意义的,在D3DXCOLOR中,颜色乘法定义为对应分量分别相乘
为顶点数据结构添加一个表示颜色的数据成员
struct ColorVertex{
float x,y,z;
D3DCOLOR color;
static const DWORD FVF;
};
const DWORD ColorVertex::FVF = D3DFVF_XYZ|D3DFVF_DIFFUSE;
光栅化过程中,需要对多边形进行着色,着色规定了如何利用顶点的颜色来计算构成图元的像素的颜色(平面着色flat shading,Gouraud着色gouraud shading)
平面着色每个图元的每个像素都被一致地赋予该图元的第一个所指定的颜色,使用平面着色模式时,第2个和第3个顶点颜色都被忽略
平面着色容易呈现“块状”
在Gouraud着色模式下,图元中各像素的颜色值由顶点的颜色经线性差值得到
如同Direct3D中的许多其他状态量一样,着色模式由Direct3D状态机控制
Device->SetRenderState(D3DRS_SHADEMODE,D3DSHADE_FLAT);
Device->SetRenderState(D3DRS_SHADEMODE,D3DSHADE_GOURAUD);