第四章
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);