排除状态
当您创造一个可看到二边的三角形时,您通常应确实去创造出二个三角形而非一个(让一个表示三角形的前端而另一个代表后方)。您必须这么做的理由是因为在绘图过程中, Direct3D排除了任何面对远离摄影机方向的基本形状。而藉由绘制前方和后方的三角形,可以让三角形的两边都看得见,因为您绘制的是两个而非一个三角形。
Direct3D的默认值是去排除背面的逆时针顶点。换句话说,Direct3D假设您在面对着想看到的三角形的那一边时,是依逆时针方向定义顶点。您可以呼叫SetRenderState,配合绘制状态型态及D3DCULL列举型态的一个常数,来改变Direct3D装置的排除模式(culling mode)。虽然您很少需要去改变排除模式,在以下的二种情况下您仍有必要去这样做: ? 您需要去汇入3D内容,其中的三角形是依逆时针方向设定。
? 您试着想找出为何看不到某个对象,因此您用D3DCULL_NONE让Direct3D不会排
除任何对象。
以下的程序段落说明了如何设定排除模式来排除顺时针方向的顶点背面:
//
//设定排除模式。 //
lpD3DDevice7->SetRenderState(D3DRENDERSTATE_CULLMODE,D3DCULL_CW);
您可以用刚提到的D3DCULL列举型态来定义可支持的排除模式,设定在绘制3D对象时如何排除背面。以下是型态的定义:
typedef enum _D3DCULL {
D3DCULL_NONE D3DCULL_CW D3DCULL_CCW
=1, =2, =3,
D3DCULL_FORCE_DWORD =0x7fffffff,
}D3DCULL;
这些成员用法如下:
? D3DCULL_NONE 背面不予排除。
? D3DCULL_CW 排除顺时针顶点的背面。
? D3DCULL_CCW 排除逆时针顶点的背面。
? D3DCULL_FORCE_DWORD 强制列举型态为32位。
深度缓冲状态
深度缓冲(depth buffering)会删除隐藏的线条和绘图页。Direct3D的默认值是不执行深度缓冲。您可以用D3DRENDERSTATE_ZENABLE绘制状态来设定深度缓冲状态,并将D3DZBUFFERTYPE列举型态的成员之一传给它。以下的程序设定了深度缓冲状态以启动z缓冲区:
//
//启动z缓冲 //
lpDev7->SetRenderState(D3DRENDERSTATE_ZENABLE,D3DZB_TRUE);
填充状态
Direct3D的默认值是填满您指定的三角形内容。但是也可以设定为只画出三角形的「线条外框」或是在三角形的每个顶点上只绘制单一像素。您可以用
D3DRENDERSTATE_FILLMODE并从D3DFILLMODE列举型态中指定一个值来选择填入基本形状的方法。这个储存了可能的填入模式的对应常数的列举型态,其定义如下:
typedef enum _D3DFILLMODE {
D3DFILL_POINT D3DFILL_WIREFRAME D3DFILL_SOLID D3DFILL_FORCE_DWORD
=1, =3
=0x7fffffff,
=2,
}D3DFILLMODE;
Direct3D可用来填入基本形状之中的成员值如下列:
? D3DFILL_POINT 让Direct3D在每个指定顶点上画一个1像素大小的点。
? D3DFILL_WIREFRAME 让Direct3D在指定顶点间画线条。这个模式不适用于使用
DrawPrimitive方法时已裁切的基本形状。
? D3DFILL_SOLID 让Direct3D填满指定三角形的内部。
? D3DFILL_FORCE_DWORD 强制列举型态为32位。
烟雾状态
您可以用烟雾效果(fog effects)来模拟烟雾或依距离减少场景的清晰度。后者指的是当对象越来越远离观察者时,会变得比较不清楚,就好像日常生活的状况一样。要启动烟雾可以用以下的程序:
//
//启动烟雾。 //
FLOAT fFogStart FLOAT fFogEnd
=1.0f; =50.0f;
lpDev7->SetRenderState(D3DRENDERSTATE_FOGENABLE,TRUE); lpDev7->SetRenderState(D3DRENDERSTATE_FOGCOLOR,WATER_COLOR); lpDev7->SetRenderState(D3DRENDERSTATE_FOGTABLEMODE,D3DFOG_NONE); lpDev7->SetRenderState(D3DRENDERSTATE_FOGVERTEXMODE,D3DFOG_LINEAR); lpDev7->SetRenderState(D3DRENDERSTATE_FOGSTART, *((DWORD *)(&fFogStart)));
lpDev7->SetRenderState(D3DRENDERSTATE_FOGEND, *((DWORD *)(&fFogEnd)));
第九章 涵盖了Direct3D支持的烟雾型态的详细介绍。在该章中您也会学到如何增加对不同烟雾型态的的支持。
打光状态
您可以打开或关闭打光计算(默认值是打开)。只有包含顶点法向量的顶点才会被适当打光。任何其它的顶点都会在所有的打光计算中使用0的点乘积,因此他们无法接收光源。
//
//关闭打光功能。 //
lpDev7->SetRenderState(D3DRENDERSTATE_LIGHTING,FALSE);
外框状态
Direct3D装置的默认值会对基本形状填满外框。您可以很容易地用D3DLINEPATTERN结构去改变外框花色,如以下程序段落:
//
//设定外框花色。 //
//1100110011001100 (0xCCCC)的线条花色就是产生一条虚线。 DWORD linePattern=0xCCCC;
lpD3DDevice7->SetRenderState(D3DRENDERSTATE_LINEPATTERN, linePattern);
针对每一顶点的色彩状态(per-vertex color states)
这种弹性的顶点格式允许顶点含有顶点色彩和顶点法向量信息(虽然D3DVERTEX、 D3DLVERTEX和D3DTL-VERTEX顶点型态不能同时含有色彩和法向量信息)色彩和法向量是用在打光计算上的。如果您想要关闭顶点色彩打光信息,您要做以下呼叫:
lpDev7->SetRenderState(D3DRENDERSTATE_COLORVERTEX,FALSE);
您可以设定来源让系统取得某个顶点(当每一顶点色彩功能启动时)的色彩信息,透过以下的绘制状态:
? D3DRENDERSTATE_DIFFUSEMATERIALSOURCE
? D3DRENDERSTATE_SPECULARMATERIALSOURCE
? D3DRENDERSTATE_AMBIENTMATERIALSOURCE
? D3DRENDERSTATE_EMISSIVEMATERIALSOURCE
这些绘制状态控制散射、直接照射、环境和发散色彩成元来源的色彩来源。设定这些状态为D3DMATERIALCOLORSOURCE列举型态的成员,常数则可要求使用目前材质、散射色彩或直接照射色彩,作为指定色彩成元的来源。
上色状态
虽然Direct3D默认值使用Gouraud上色,您还是可以使用平面上色(flat shading)。您可以依以下方式设定上色状态为平面上色模式:
//
//设定上色状态。 //
lpDev7->SetRenderState(D3DRENDERSTATE_SHADEMODE,D3DSHADE_FLAT);
屏蔽缓冲状态
您可以用屏蔽缓冲来决定某个像素是否会写入绘图目标绘图页。您可以用以下的呼叫方式来启动屏蔽:
//
//设定屏蔽缓冲区状态 //
lpDev7->SetRenderState(D3DRENDERSTATE_STENCILENABLE,TRUE);
一旦设定该模式,您可以依下列内容设定比较函式来执行屏蔽测试(stencil test),第二个参数值则用一个D3DCMPFUNC列举型态的成员:
//
//设定屏蔽测试比较以测试小于或等于。 //
lpDev7->SetRenderState(D3DRENDERSTATE_STENCILFUNC, D3DCMP_LESSEQUAL);