前言:
图元的颜色是由构成该图元的顶点的颜色所决定的,而物体是由图元索组成。那么如果我们要绘制一个具有颜色的三角形,我们就需要为三角形图元顶点附加颜色属性。
1.Direct3D中颜色的表示:
在Direct3D中,颜色用RGB来表示(这个大家都知道,咳咳。)通畅人为颜色可以分为红色(red)、绿色(green)、蓝色(bule)。这三个分量进行混合,以达到我们想要的颜色取得目的。RGB的数据可以用两种方式来进行存储一种是D3DCOLOR ,另一种是:DWORD。这是因为D3DCOLOR完全等同于DWORD(在MSDN中:
typedef DWORD D3DCOLOR;)关于Alpha分量,先不进行说明。因为这个现在用不到。
要指定每个颜色分量的值,并将其插入到D3DCOLOR中,需要使用D3DCOLOR_ARPG宏。这个宏帮我们实现了二进制的运算。
使用方式:
D3DCOLOR brightRed = D3DCOLOR_ARGB(255, 255, 0, 0);
typedef struct _D3DCOLORVALUE {
float r;
float g;
float b;
float a;
} D3DCOLORVALUE;
用单精度数来度量每个分量的亮度值,取值范围为0~1.
但是这种结构很少用到。因为D3DCOLORVALUE结构可以转换为D3DCOLOR,而且D3DCOLOR比D3DCOLORVALUE所包含的功能方法更为强大。
2.着色:
这里先说一下什么是光栅化:简单理解,我们在现实生活中,如果绘制一个三角形,每条线是由无数个无穷小的点构成的。但是在计算机中,没有这个无穷小的处理方法,在屏幕上的三角形是由很多点像素构成,将连续的图像用离散的像素表示的过程就是光栅化。
在光栅化的过程中,需要对三角形进行着色。着色规定了如何利用顶点颜色来计算构成像素的颜色。在Direct3D中有两种着色模式:
第一种:平面着色:每个图元的像素都被一致的赋予该图元的第一个顶点的颜色。
第二种:Gouraud着色:土元种的各像素的颜色值由顶点的颜色经线性插值得到。
那么接下来我们就用这两种着色模式来绘制两个三角形:
要完成的操作:
1.定义顶点结构:
struct Vertex //顶点结构
{
Vertex(){}
Vertex(float x, float y, float z, D3DCOLOR color)
{
_x = x; _y = y; _z = z;
_color = color;
}
float _x, _y, _z;
D3DCOLOR _color;
static const DWORD FVF;
};
//顶点格式:说明对应于