转载自:http://www.cnblogs.com/konlil/archive/2010/10/17/1956655.html
d3d渲染状态
在渲染循环中,在渲染物体之前需要设置好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, [...]
4.全景图形抗锯齿
SetRenderState(D3DRS_MUTISAMPLEANTIALIAS, TRUE) //抗锯齿
SetRenderState(D3DRS_MUTISAMPLEANTIALIAS, FALSE) //不抗锯齿
5.设置关照模式
SetRenderState(D3DRS_AMBIENT, D3DCOLOR ambientColor); //为整个场景设置环境光
SetRenderState(D3DRS_SPECULARENABLE, TRUE); //激活镜面反射计算(D3D默认情况下关闭)
6.设置纹理过滤器
//线性纹理
SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
//最近点采样
SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_ POINT);
SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_POINT);
//各向异性纹理过滤
SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_ANISOTROPIC)
SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_ ANISOTROPIC);
7.打开缩放功能SetRenderState( D3DRS_POINTSCALEENABLE, TRUE ); //打开缩放功能
SetRenderState( D3DRS_POINTSCALE_A , FtoDW( 1.00f ));//设置因子,下同
SetRenderState( D3DRS_POINTSCALE_B , FtoDW( 1.00F ));
SetRenderState( D3DRS_POINTSCALE_C , FtoDW( 1.00f ));
SetRenderState( D3DRS_POINTSIZE_MAX, FtoDW( 5.00f ));//设置点大小上限,下类似
SetRenderState( D3DRS_POINTSIZE_MAX, FtoDW( 5.00f ));
SetRenderState( D3DRS_POINTSPRITEENABLE , TRUE ) ; //打开点精灵效果
SetRenderState( D3DRS_AMBIENT, 0xffffffff ); //设置环境光颜色开启ALPHA混合效果
8.设置融合
源:SetRenderState( D3DRS_SRCBLEND , D3DBLEND_SRCALPHA );
目的:SetRenderState( D3DRS_DESTBLEND , D3DBLEND_INVSRCALPHA);
第二个参数是 D3DBLEND的枚举结构。
更多渲染状态:
typedef enum D3DRENDERSTATETYPE { D3DRS_ZENABLE = 7, D3DRS_FILLMODE = 8, D3DRS_SHADEMODE = 9, D3DRS_ZWRITEENABLE = 14, D3DRS_ALPHATESTENABLE = 15, D3DRS_LASTPIXEL = 16, D3DRS_SRCBLEND = 19, D3DRS_DESTBLEND = 20, D3DRS_CULLMODE = 22, D3DRS_ZFUNC = 23, D3DRS_ALPHAREF = 24, D3DRS_ALPHAFUNC = 25, D3DRS_DITHERENABLE = 26, D3DRS_ALPHABLENDENABLE = 27, D3DRS_FOGENABLE = 28, D3DRS_SPECULARENABLE = 29, D3DRS_FOGCOLOR = 34, D3DRS_FOGTABLEMODE = 35, D3DRS_FOGSTART = 36, D3DRS_FOGEND = 37, D3DRS_FOGDENSITY = 38, D3DRS_RANGEFOGENABLE = 48, D3DRS_STENCILENABLE = 52, D3DRS_STENCILFAIL = 53, D3DRS_STENCILZFAIL = 54, D3DRS_STENCILPASS = 55, D3DRS_STENCILFUNC = 56, D3DRS_STENCILREF = 57, D3DRS_STENCILMASK = 58, D3DRS_STENCILWRITEMASK = 59, D3DRS_TEXTUREFACTOR = 60, D3DRS_WRAP0 = 128, D3DRS_WRAP1 = 129, D3DRS_WRAP2 = 130, D3DRS_WRAP3 = 131, D3DRS_WRAP4 = 132, D3DRS_WRAP5 = 133, D3DRS_WRAP6 = 134, D3DRS_WRAP7 = 135, D3DRS_CLIPPING = 136, D3DRS_LIGHTING = 137, D3DRS_AMBIENT = 139, D3DRS_FOGVERTEXMODE = 140, D3DRS_COLORVERTEX = 141, D3DRS_LOCALVIEWER = 142, D3DRS_NORMALIZENORMALS = 143, D3DRS_DIFFUSEMATERIALSOURCE = 145, D3DRS_SPECULARMATERIALSOURCE = 146, D3DRS_AMBIENTMATERIALSOURCE = 147, D3DRS_EMISSIVEMATERIALSOURCE = 148, D3DRS_VERTEXBLEND = 151, D3DRS_CLIPPLANEENABLE = 152, D3DRS_POINTSIZE = 154, D3DRS_POINTSIZE_MIN = 155, D3DRS_POINTSPRITEENABLE = 156, D3DRS_POINTSCALEENABLE = 157, D3DRS_POINTSCALE_A = 158, D3DRS_POINTSCALE_B = 159, D3DRS_POINTSCALE_C = 160, D3DRS_MULTISAMPLEANTIALIAS = 161, D3DRS_MULTISAMPLEMASK = 162, D3DRS_PATCHEDGESTYLE = 163, D3DRS_DEBUGMONITORTOKEN = 165, D3DRS_POINTSIZE_MAX = 166, D3DRS_INDEXEDVERTEXBLENDENABLE = 167, D3DRS_COLORWRITEENABLE = 168, D3DRS_TWEENFACTOR = 170, D3DRS_BLENDOP = 171, D3DRS_POSITIONDEGREE = 172, D3DRS_NORMALDEGREE = 173, D3DRS_SCISSORTESTENABLE = 174, D3DRS_SLOPESCALEDEPTHBIAS = 175, D3DRS_ANTIALIASEDLINEENABLE = 176, D3DRS_MINTESSELLATIONLEVEL = 178, D3DRS_MAXTESSELLATIONLEVEL = 179, D3DRS_ADAPTIVETESS_X = 180, D3DRS_ADAPTIVETESS_Y = 181, D3DRS_ADAPTIVETESS_Z = 182, D3DRS_ADAPTIVETESS_W = 183, D3DRS_ENABLEADAPTIVETESSELLATION = 184, D3DRS_TWOSIDEDSTENCILMODE = 185, D3DRS_CCW_STENCILFAIL = 186, D3DRS_CCW_STENCILZFAIL = 187, D3DRS_CCW_STENCILPASS = 188, D3DRS_CCW_STENCILFUNC = 189, D3DRS_COLORWRITEENABLE1 = 190, D3DRS_COLORWRITEENABLE2 = 191, D3DRS_COLORWRITEENABLE3 = 192, D3DRS_BLENDFACTOR = 193, D3DRS_SRGBWRITEENABLE = 194, D3DRS_DEPTHBIAS = 195, D3DRS_WRAP8 = 198, D3DRS_WRAP9 = 199, D3DRS_WRAP10 = 200, D3DRS_WRAP11 = 201, D3DRS_WRAP12 = 202, D3DRS_WRAP13 = 203, D3DRS_WRAP14 = 204, D3DRS_WRAP15 = 205, D3DRS_SEPARATEALPHABLENDENABLE = 206, D3DRS_SRCBLENDALPHA = 207, D3DRS_DESTBLENDALPHA = 208, D3DRS_BLENDOPALPHA = 209, D3DRS_FORCE_DWORD = 0x7fffffff } D3DRENDERSTATETYPE, *LPD3DRENDERSTATETYPE;详见:http://msdn.microsoft.com/en-us/library/windows/desktop/bb172599%28v=vs.85%29.aspx