在D3D中, 颜色使用RGB形式表现的。有两种结构来表现颜色D3DCOLOR和D3DCOLORVALUE。
typedef DWORD D3DCOLOR; D3DCOLOR brightRed = D3DCOLOR_ARGB(255, 255, 0, 0); typedef struct D3DCOLORVALUE { float r; // the red component, range 0.0-1.0 float g; // the green component, range 0.0-1.0 float b; // the blue component, range 0.0-1.0 float a; // the alpha component, range 0.0-1.0 } D3DCOLORVALUE;
一个面的颜色是有其相应点的颜色决定的, 所以我们顶一个点的时候就得为其增加颜色变量。
struct colorVertex { colorVertex(){} colorVertex(float x, float y, float z, D3DCOLOR c) { _x = x; _y = y; _z = z; _color = c; } float _x, _y, _z; D3DCOLOR _color; static const DWORD FVF; }; const DWORD colorVertex::FVF = D3DFVF_XYZ | D3DFVF_DIFFUSE;
有两种渲染方式: flat shading 和Gourud shding.
比如我们定义这样3个点的三角形
colorVertex* vertices; VB->Lock(0, 0, (void**)&vertices, 0); // vertices of a unit cube vertices[0] = colorVertex(-1.0f, 0.0f, 2.0f, D3DCOLOR_XRGB(255, 0, 0)); vertices[1] = colorVertex( 0.0f, 1.0f, 2.0f, D3DCOLOR_XRGB( 0, 255, 0)); vertices[2] = colorVertex( 1.0f, 0.0f, 2.0f, D3DCOLOR_XRGB( 0, 0, 255)); VB->Unlock();
然后用如下方式画出:
D3DXMATRIX WorldMatrix; // draw the triangle to the left with flat shading D3DXMatrixTranslation(&WorldMatrix, -1.25f, 0.0f, 0.0f); Device->SetTransform(D3DTS_WORLD, &WorldMatrix); Device->SetRenderState(D3DRS_SHADEMODE, D3DSHADE_FLAT); Device->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1); // draw the triangle to the right with gouraud shading D3DXMatrixTranslation(&WorldMatrix, 1.25f, 0.0f, 0.0f); Device->SetTransform(D3DTS_WORLD, &WorldMatrix); Device->SetRenderState(D3DRS_SHADEMODE, D3DSHADE_GOURAUD); Device->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1);
得到的图形是这样的:
左图是用 flat shading: 三角形的颜色就第一个点的颜色
右图是用 Gouraud shading: 通过差值算法算出。