Direct3D基础——颜色

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/DY_1024/article/details/84314262

颜色表示

在Direct3D中颜色使用RGB来表示,我们认为颜色都可以分成:Red(红色)、Green(绿色)、Blue(蓝色)这三种颜色的加性混合,跟向量一样。

RGB数据可以使用两种不同的结构来保存。

第一种是:D3DCOLOR,这个结构和DWORD完全相同,由typdef进行定义,一共4个字节,32位,D3DCOLOR类型中的各个分量被分成四个8位置的数据,分别来储存RGB三个颜色和一个Alpha值,每一项都代表了该位置对应颜色的亮度,如下图:

因为每一钟颜色只占用1字节,所以范围就在(1,255)之间,接近0的值表示低亮度,接近255的值表示高亮度。

对于简单的了解,我们暂时先不去关心Alpha值,他主要用于Alpha融合。

对于每一个颜色的值,我们要将他插到对应的D3DCOLOR结构位置里面,就需要进行位运算,Direct3D中有提供一个D3DCOLOR_ARGB宏来帮助我们。该宏中第一个参数是Alpha值,后面三个参数是3种颜色的分量,每个参数必须在0~255之间取值,调用方法如下:

D3DCOLOR brightRed = D3DCOLOR_ARGB(255,255,0,0);
D3DCOLOR someColor = D3DCOLOR_ARGB(255,144,87,201);

我们也可以使用D3DCOLOR_XRGB这个结构来表示,这个结构就是其实只是对D3DCOLOR_ARGB进行了一次封装,不接收Alpha值,然后将Alpha值设置为255,传给D3DCOLOR_ARGB这个结构

#definne D3DCOLOR_XRGB(r,g,b) D3DCOLOR_ARGB(0xff,r,g,b)

第二种表示方法:D3DCOLORVALUE,在该结构中,我们使用单精度浮点类型来度量每一种颜色的分量,亮度的去取值在:0.0~1.0之间(0表示没有亮度,1表示亮度最大)。

typedef struct D3DCOLORVALUE
{
	float r;
	float g;
	float b;
	float a;
}D3DCOLORVALUE;

当然,我们可以使用D3DXCOLOR代替D3DCOLORVALUE,这两个结构里面的成员变量是一模一样的,但是D3DXCOLOR里面提供了一组运算符重载,方便我们计算,因为这两个结构的数据成员相同,所以这两个结构定义的变量可以相互转换。

说明:D3DCOLORVALUE和D3DXCOLOR结构都是4个浮点类型的成员,这样我们就可以将颜色表示为一个4D的向量(r,g,b,a)了,颜色向量的加法,减法和常规向量加减法相同,而颜色向量的点积和叉积没有意义,但是向量分量之间相乘是有意义的,所以在D3DXCOLOR中,向量的乘法定义就是对应的分量相乘。

当我们在文件添加一些全局颜色分量:

namespace d3d {
	const D3DXCOLOR WHITE(D3DCOLOR_XRGB(255, 255, 255));
	const D3DXCOLOR BLACK(D3DCOLOR_XRGB(0,0,0));
	const D3DXCOLOR RED(D3DCOLOR_XRGB(255, 0, 0));
	const D3DXCOLOR GREEN(D3DCOLOR_XRGB(0,255,0));
	const D3DXCOLOR BLUE(D3DCOLOR_XRGB(0,0,255));
	const D3DXCOLOR YELLOW(D3DCOLOR_XRGB(255,255,0));
	const D3DXCOLOR CYAN(D3DCOLOR_XRGB(0,255,255));
	const D3DXCOLOR MAGENTA(D3DCOLOR_XRGB(255,0,255));
}

顶点颜色

图元的颜色是由我们的顶点的颜色所决定,所以我们必须为顶点的结构添加一个表示颜色的成员。注意:Direct3D希望我们使用32位的值来描述顶点的颜色,所以我们必须使用:D3DCOLOR,但是实际上我们在顶点着色器中使用的是4D的颜色向量,即每一种的颜色都是用128位来表示,也就是使用我们的D3DXCOLOR结构来表示,但是现在我们暂且先不去讨论。

struct ColorVertex
{
	float x, y, z;
	D3DCOLOR color;
	static const DWORD FVF;
};
const DWORD ColorVertex::FVF = D3DFVF_XYZ | D3DFVF_DIFFUSE;

着色

着色发生在光栅化的过程中,我们需要利用顶点的颜色来计算构成图元的像素的颜色,目前我们使用两种着色:一种是平面着色(flat shading)一种是:Gouraud着色(grouraud shading)

平面着色:图元中的每一个像素都会被涂上第一个顶点的颜色,所以三角形的颜色就是第一个顶点的颜色,第二个第三个顶点的颜色将会被忽略。缺点就是:着色之后的图元看起来像一个块。

ColorVertex T[3];
t[0] = D3DCOLOR_XRGB(255,0,0)
t[1] = D3DCOLOR_XRGB(0,255,0)
t[2] = D3DCOLOR_XRGB(0,0,255)

上面这个例子就是一个红色的三角形,因为第一个顶点就是红色。

还有一种更好的着色方式:Gouraud着色,也成平滑着色。在Gouraud着色模式下,各个像素的颜色是各个顶点的颜色经过线性差值得到。

如同Direct3D的其它状态量一样,着色模式由Direct3D状态机(state machine)控制。

//设置平面着色模式
Device->SetRenderState(D3DRS_SHADEMODE,D3DSHADE_FLAT);
//设置Gouraud着色模式
Device->SetRenderState(D3DRS_SHADEMODE,D3DSHADE_GOURAUD);

猜你喜欢

转载自blog.csdn.net/DY_1024/article/details/84314262
今日推荐