在渲染循环中,在渲染物体之前需要设置好dx的渲染环境,其中调用的最频繁的api莫过于用于切换渲染状态的函数:IDirect3DDevice::SetRenderState(). SetRenderState函数用于设置各种不同类型的渲染状态,其功能用法汇总于下:
0、填充模式 SetRenderState(D3DRS_FILLMODE, …); 可设置的模式有:D3DFILL_POINT,D3DFILL_WIREFRAME,D3DFILL_SOLID,分别为点模式、线框模式及实填充模式。
1、着色模式 SetRenderState(D3DRS_SHADEMODE, …); 可设置的着色模式为:D3DSHADE_GOURAND(默认),D3DSHADE_FLAT,D3DSHADE_PHONG,分别为:高洛德着色、平面着色和PONG模型着色。其中平面着色最简单,使用三角形的第一个顶点颜色进行着色;高洛德着色则利用三角形面片的三个顶点的颜色进行线性插值来对面上像素进行着色,又成为双线性亮度插值着色;PHONG着色则对利用三个顶点的法向量进行插值,因此又被称作双线性法向量插值着色,相比于高洛德着色,其更加逼真,但计算更复杂。
2、CullFace相关 SetRenderState(D3DRS_CULLMODE, …); 可设置的Cull模式为:D3DCULL_NONE, D3DCULL_CW, D3DCULL_CCW, 分别为:不剔除背面,按顺时针方向确定背面,按逆时针方向确定背面;如果绘制时按顺时针组织网格,则应使用逆时针剔除;否则,则使用顺时针剔除。
3、ZBuffer相关 SetRenderState(D3DRS_ZENABLE, …); 可设置的值有:D3DZB_FALSE, D3DZB_TRUE, D3DZB_USEW, 分别表示禁用深度缓冲、启用Z-深度缓冲,启用W-深度缓冲。 所谓深度缓冲,是一个DirectDraw表面,保存着D3D使用的深度信息;当一个场景进入光栅,并且深度缓冲启用时,渲染表面上的每个点都会被检查;深度缓冲中的值作为点的z坐标值或者等同的w坐标值;使用z值的缓冲叫ZBuffer,使用w值的就交WBuffer;ZBuffer几乎被所有的硬件支持,是最常用的深度缓冲;然而z-buffers也有它本身的缺陷。由于它所使用的数学方法,使得一个z-buffer中产生的z值在它允许的范围内(通常为0.0到1.0之间,包括它们)并不是均匀分布的。特别是靠近剪切面与远离剪切面处的比例,更是影响了z值的均匀分布。相对于ZBuffer, WBuffer能在远近裁剪面之间进行更精确的分配,但是wbuffer却不被硬件厂商广泛支持。 SetRenderState(D3DRS_ZFUNC, …); 设置深度缓冲比较函数,可设置的值有:D3DCMP_LESSEQUAL(默认),D3DCMP_GREATER 等等,在DX文档中的枚举定义为: typedef enum D3DCMPFUNC { D3DCMP_NEVER = 1, [...]