Render States |
Default Value |
D3DRS_CULLMODE(剔除模式) |
D3DCULL_CCW(剔除逆时针顺序的点平面) |
D3DRS_FOGCOLOR(雾颜色) |
0 |
D3DRS_FOGTABLEMODE |
D3DFOG_NONE |
D3DRS_FOGSTART |
0 |
D3DRS_FOGEND |
1 |
D3DRS_FOGDENSITY(雾密度) |
1 |
D3DRS_RANGEFOGENABLE |
FALSE |
D3DRS_AMBIENT(环境(光)色) |
0 |
D3DRS_COLORVERTEX |
TRUE |
D3DRS_FOGVERTEXMODE |
D3DFOG_NONE |
D3DRS_CLIPPING(裁剪) |
TRUE |
D3DRS_LIGHTING(光照) |
TRUE |
D3DRS_LOCALVIEWER |
TRUE |
D3DRS_EMISSIVEMATERIALSOURCE |
D3DMCS_MATERIAL |
D3DRS_AMBIENTMATERIALSOURCE |
D3DMCS_MATERIAL |
D3DRS_DIFFUSEMATERIALSOURCE |
D3DMCS_COLOR1 |
D3DRS_SPECULARMATERIALSOURCE |
D3DMCS_COLOR2 |
D3DRS_VERTEXBLEND |
D3DVBF_DISABLE |
D3DRS_CLIPPLANEENABLE |
0 |
D3DRS_POINTSIZE |
Driver dependent |
D3DRS_POINTSIZE_MIN |
1 |
D3DRS_POINTSPRITEENABLE |
FALSE |
D3DRS_POINTSCALEENABLE |
FALSE |
D3DRS_POINTSCALE_A |
1 |
D3DRS_POINTSCALE_B |
0 |
D3DRS_POINTSCALE_C |
0 |
D3DRS_MULTISAMPLEANTIALIAS |
TRUE |
D3DRS_MULTISAMPLEMASK |
0xffffffff |
D3DRS_PATCHEDGESTYLE |
D3DPATCHEDGE_DISCRETE |
D3DRS_POINTSIZE_MAX |
1 |
D3DRS_INDEXEDVERTEXBLENDENABLE |
FALSE |
D3DRS_TWEENFACTOR |
0 |
D3DRS_POSITIONDEGREE |
D3DDEGREE_CUBIC |
D3DRS_NORMALDEGREE |
D3DDEGREE_LINEAR |
D3DRS_MINTESSELLATIONLEVEL |
1 |
D3DRS_MAXTESSELLATIONLEVEL |
1 |
D3DRS_ADAPTIVETESS_X |
0 |
D3DRS_ADAPTIVETESS_Y |
0 |
D3DRS_ADAPTIVETESS_Z |
1 |
D3DRS_ADAPTIVETESS_W |
0 |
D3DRS_ENABLEADAPTIVETESSELLATION"/> |
FALSE |
Sampler States |
Default Value |
D3DSAMP_DMAPOFFSET |
256 |
Texture States |
Default Value |
D3DTSS_TEXCOORDINDEX |
0 |
D3DTSS_TEXTURETRANSFORMFLAGS |
D3DTTFF_DISABLE |
Render States |
Default Value |
D3DRS_ZENABLE |
D3DZB_FALSE |
D3DRS_SPECULARENABLE |
FALSE |
D3DFILLMODE |
D3DFILL_SOLID |
D3DSHADEMODE |
D3DSHADE_GOURAUD |
D3DRS_ZWRITEENABLE |
TRUE |
D3DRS_ALPHATESTENABLE |
FALSE |
D3DRS_LASTPIXEL |
TRUE |
D3DRS_SRCBLEND |
D3DBLEND_ONE |
D3DRS_DESTBLEND |
D3DBLEND_ZERO |
D3DRS_ZFUNC |
D3DCMP_LESSEQUAL |
D3DRS_ALPHAREF |
0 |
D3DRS_ALPHAFUNC |
D3DCMP_ALWAYS |
D3DRS_DITHERENABLE |
FALSE |
D3DRS_FOGSTART |
0 |
D3DRS_FOGEND |
1 |
D3DRS_FOGDENSITY |
1 |
D3DRS_ALPHABLENDENABLE |
FALSE |
D3DRS_DEPTHBIAS |
0 |
D3DRS_STENCILENABLE |
FALSE |
D3DRS_STENCILFAIL |
D3DSTENCILOP_KEEP |
D3DRS_STENCILZFAIL |
D3DSTENCILOP_KEEP |
D3DRS_STENCILPASS |
D3DSTENCILOP_KEEP |
D3DRS_STENCILFUNC |
D3DCMP_ALWAYS |
D3DRS_STENCILREF |
0 |
D3DRS_STENCILMASK |
0xffffffff |
D3DRS_STENCILWRITEMASK |
0xffffffff |
D3DRS_TEXTUREFACTOR |
0xffffffff |
D3DRS_WRAP0 |
0 |
D3DRS_WRAP1 |
0 |
D3DRS_WRAP2 |
0 |
D3DRS_WRAP3 |
0 |
D3DRS_WRAP4 |
0 |
D3DRS_WRAP5 |
0 |
D3DRS_WRAP6 |
0 |
D3DRS_WRAP7 |
0 |
D3DRS_WRAP8 |
0 |
D3DRS_WRAP9 |
0 |
D3DRS_WRAP10 |
0 |
D3DRS_WRAP11 |
0 |
D3DRS_WRAP12 |
0 |
D3DRS_WRAP13 |
0 |
D3DRS_WRAP14 |
0 |
D3DRS_WRAP15 |
0 |
D3DRS_LOCALVIEWER |
TRUE |
D3DRS_EMISSIVEMATERIALSOURCE |
D3DMCS_MATERIAL |
D3DRS_AMBIENTMATERIALSOURCE |
D3DMCS_MATERIAL |
D3DRS_DIFFUSEMATERIALSOURCE |
D3DMCS_COLOR1 |
D3DRS_SPECULARMATERIALSOURCE |
D3DMCS_COLOR2 |
D3DRS_COLORWRITEENABLE |
0x0000000f |
D3DBLENDOP |
D3DBLENDOP_ADD |
D3DRS_SCISSORTESTENABLE |
FALSE |
D3DRS_SLOPESCALEDEPTHBIAS |
0 |
D3DRS_ANTIALIASEDLINEENABLE |
FALSE |
D3DRS_Two_Sided_StencilMODE |
FALSE |
D3DRS_CCW_STENCILFAIL |
D3DSTENCILOP_KEEP |
D3DRS_CCW_STENCILZFAIL |
D3DSTENCILOP_KEEP |
D3DRS_CCW_STENCILPASS |
D3DSTENCILOP_KEEP |
D3DRS_CCW_STENCILFUNC |
D3DCMP_ALWAYS |
D3DRS_COLORWRITEENABLE1 |
0x0000000f |
D3DRS_COLORWRITEENABLE2 |
0x0000000f |
D3DRS_COLORWRITEENABLE3 |
0x0000000f |
D3DRS_BLENDFACTOR |
0xffffffff |
D3DRS_SRGBWRITEENABLE |
0 |
D3DRS_SEPARATEALPHABLENDENABLE |
FALSE |
D3DRS_SRCBLENDALPHA |
D3DBLEND_ONE |
D3DRS_DESTBLENDALPHA |
D3DBLEND_ZERO |
D3DRS_BLENDOPALPHA |
D3DBLENDOP_ADD |
Sampler States |
Default Value |
D3DSAMP_ADDRESSU |
D3DTADDRESS_WRAP |
D3DSAMP_ADDRESSV |
D3DTADDRESS_WRAP |
D3DSAMP_ADDRESSW |
D3DTADDRESS_WRAP |
D3DSAMP_BORDERCOLOR |
0x00000000 |
D3DSAMP_MAGFILTER |
D3DTEXF_POINT |
D3DSAMP_MINFILTER |
D3DTEXF_POINT |
D3DSAMP_MIPFILTER |
D3DTEXF_NONE |
D3DSAMP_MIPMAPLODBIAS |
0 |
D3DSAMP_MAXMIPLEVEL |
0 |
D3DSAMP_MAXANISOTROPY |
1 |
D3DSAMP_SRGBTEXTURE |
0 |
D3DSAMP_ELEMENTINDEX |
0 |
Texture States |
Default Value |
D3DTSS_COLOROP |
D3DTOP_DISABLE |
D3DTSS_COLORARG1 |
D3DTA_TEXTURE |
D3DTSS_COLORARG2 |
D3DTA_CURRENT |
D3DTSS_ALPHAOP |
D3DTOP_DISABLE |
D3DTSS_ALPHAARG1 |
D3DTA_TEXTURE |
D3DTSS_ALPHAARG2 |
D3DTA_CURRENT |
D3DTSS_BUMPENVMAT00 |
0 |
D3DTSS_BUMPENVMAT01 |
0 |
D3DTSS_BUMPENVMAT10 |
0 |
D3DTSS_BUMPENVMAT11 |
0 |
D3DTSS_TEXCOORDINDEX |
0 |
D3DTSS_BUMPENVLSCALE |
0 |
D3DTSS_BUMPENVLOFFSET |
0 |
D3DTSS_TEXTURETRANSFORMFLAGS |
D3DTTFF_DISABLE |
D3DTSS_COLORARG0 |
D3DTA_CURRENT |
D3DTSS_ALPHAARG0 |
D3DTA_CURRENT |
D3DTSS_RESULTARG |
D3DTA_CURRENT |
C++应用程序可使用Alpha测试来控制像素何时被吸入渲染目标平面。通过使用D3DRS_ALPHATESTENABLE渲染状态,应用程序设置当前Direct3D设备依照Alpha测试函数测试每一个像素。如果测试成功,像素被写在该平面。如果失败,Direct3D忽略该像素。使用D3DRS_ALPHAFUNC渲染状态选择Alpha测试函数。应用程序可以通过使用D3DRS_ALPHAREF渲染状态为所有的像素设置Alpha参考值用于比较。
Alpha测试最一般的用途是当栅格华对象几乎透明时用于改进性能。如果被栅格化的颜色数据比给定像素的颜色值更不透明(D3DCMPCAPS_GREATEREQUAL),则像素被写入。否则,光栅完全忽略该像素,节省了对两个颜色的混合请求的处理。下面的代码举例说明检测是否所给定的比较被支持,如果被支持,设置比较函数必要的参数在渲染时改进性能。
//该例子假设pCaps为D3DCAPS9结构在之前调用IDirect3D9::GetDeviceCaps
//时被填充
if(pCaps.AlphaCmpCaps & D3DPCMPCAPS_GREATEREQUAL)
{
dev->SetRenderState(D3DRS_ALPHAREF, (DWORD)0x00000001);
dev->SetRenderState(D3DRS_ALPHATESTENABLE, TRUE);
dev->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL);
}
//若该比较不支持,继续渲染。
//唯一的缺点是没有性能的提升。
并不时所有的硬件支持所有的Alpha测试特性。你可以通过调用GetDeviceCaps方法检测设备能力。在重新获取设备能力后,检测相关的D3DCAPS9结构的AlphaCmpCaps成员是否支持需要的比较函数。如果AlphaCmpCaps成员包含仅仅D3DPCMPCAPS_ALWAYS能力或D3DPCMPCAPS_NEVER能力,那驱动程序不支持Alpha测试。
环境光是环境从所有方向辐射的光线。要了解Direct3D如何使用环境光照,参考光照数学(Mathematics of Lighting)。
C++应用程序通过在调用SetRenderState方法时给第一个参数传递枚举值D3DRS_AMBIENT设置环境光颜色。第二个参数为颜色值。默认值为0。
d3dDevice->SetRenderState(D3DRS_AMBIENT, 0x00202020);
反走样是使线或边缘在屏幕上外观更光滑的方法。默认情况下,Direct3D不执行反走样。要开启全屏反走样,设置D3DRS_MULTISAMPLEANTIALIAS渲染状态为TRUE。要关闭反走样则设置该渲染状态值为FALSE。
要改进渲染性能,你可以挑选(或删除)背离摄像机的图元面。对于单面图元,由于背面不可见,此方法节省了渲染时间。要开启剔出,你需要知道定点的环绕顺序(一般为逆时针)。此例子讲删除任何背面向前的图元(给定逆时针环绕顺序):
SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW);
深度缓存是删除隐藏线或隐藏面的方法。默认情况下,Direct3D不使用深度缓存。
C++应用程序使用D3DRS_ZENABLE渲染状态更新深度缓存状态,使用D3DZBUFFERTYPE枚举成员以制定新的状态值。
如果你的应用程序需要阻止Direct3D写入深度缓存,可在调用SetRenderState时使用D3DRS_ZWRITEENABLE枚举值,并给第二个参数指定值D3DZB_FALSE。
下面的代码说明如何将深度缓存状态设置为开启Z缓存。
d3dDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE);
应用程序也可以使用D3DRS_ZFUNC渲染状态来控制Direct3D在执行深度缓存时的比较函数。
Z偏移是将一个平面在另一平面前显示的方法,即时他们的深度值相同。你可以使用该技术实现变化的效果。一般的例子是渲染墙的阴影。墙和阴影具有相同的深度值。然而,你希望你的应用程序在墙上显示阴影。给阴影加上一个Z偏移使Direct3D合适的显示他们(参见D3DRS_DEPTHBIAS)。
舞化效果使得3D场景更加真实。你可以使用雾化效果更好的模拟雾(You can use fog effects for more than simulating fog)。他们同样可以根据距离减小场景的清晰度。这反映了现实世界中发生的情况;随着物体远离用户,他们的细节变得更模糊。
C++应用程序通过设备渲染状态控制雾化。D3DRENDERSTATETYPE枚举类型包含的状态控制像素(表)或顶点雾是否使用,它们的颜色,系统使用的雾化计算公式和公式的参数。
你通过将D3DRS_FOGENABLE渲染状态设置为TRUE开启雾化效果。可以使用D3DRS_FOGCOLOR渲染状态将雾颜色设置为任意值;雾颜色的Alpha值被忽略。
D3DRS_FOGTABLEMODE和D3DRS_FOGVERTEXMODE渲染状态控制应用于雾计算的公式,它们间接地控制所使用的雾化类型。两个渲染状态可设置D3DFOGMODE枚举类型中的成员。分别设置为这两个渲染状态设置D3DFOG_NONE值关闭像素和顶点雾效果。如果两个渲染状态都被设置为有效的模式,系统仅应用像素渲染效果。
D3DRS_FOGSTART和D3DRS_FOGEND渲染状态控制D3DFOG_LINEAR模式的雾化公式的参数。D3DRS_FOGDENSITY渲染状态控制指数(exponential)雾化模式的雾密度。
如果你不使用顶点着色器或像素着色器进行光照,你可以在运行时选择光照引擎。光照引擎要求顶点数据中包含每个顶点的法线;没有法线数据的顶点在光照计算时会发生点积为0的情况。光照计算在光照数学(Mathematics of lighting)中有更详细的介绍。
要开启光照引擎,使用:
SetRenderState(D3DRS_LIGHTING, TRUE);
在执行光照时如果你告知运行时显示顶点颜色数据,Direct3D光照引擎会使用逐顶点颜色数据。通过开启下面的渲染状态:
//关闭逐点颜色渲染
SetRenderState(D3DRS_COLORVERTEX, FALSE);
//关闭逐点颜色渲染
SetRenderState(D3DRS_COLORVERTEX, TRUE);
如果逐点颜色被开启,应用程序可以配置系统获取顶点颜色信息的源。D3DRS_AMBIENTMATERIALSOURCE, D3DRS_DIFFUSEMATERIALSOURCE, D3DRS_EMISSIVEMATERIALSOURCE和D3DRS_SPECULARMATERIALSOURCE渲染状态分别控制环境光,漫反射光,发射光和镜面光颜色组成源。每一个状态可以被设置为定义指示系统为指定的颜色成份使用当前材质,漫反射色或镜面光颜色作为源的D3DMATERIALCOLORSOURCE枚举类型的成员。
部分位于(或完全在外)视锥台的图元会被裁减,仅渲染图元的可视部分。裁减使得仅渲染可见的图元或图元的可见部分,从而减少了大量工作。
要使用管道进行裁减,设置D3DRS_CLIPPING渲染状态为TRUE(默认值)来开启裁减或设置为FALSE关闭Direct3D裁减。
Direct3D支持平面着色和高络德着色。默认为高络德着色。遥控制当前着色模式,C++应用程序需为D3DRS_SHADEMODE渲染状态指定一个D3DSHADEMODE枚举类型的成员。
下面的代码说明如何设置着色状态为平面着色模式:
d3dDevice->SetRenderState(D3DRS_SHADEMODE, D3DSHADE_FLAT);
应用程序使用模板缓存来决定像素是否被写入目标平面。细节参看模板缓存技术(Stencil Buffer Techniques)。
D3DRS_WRAP0到D3DRS_WRAP7渲染状态为设备的多纹理层中多个纹理开启和关闭u环绕和v环绕(纹理u,v坐标)。你可以设置这些渲染状态为D3DWRAPCOORD_0,D3DWRAPCOORD_1, D3DWRAPCOORD_2和D3DWRAPCOORD_3标识的或值来开启纹理第一个,第二个,第三个和第四个方向的环绕。使用0关闭所有的环绕。默认情况下禁用所有纹理层所有方向的纹理环绕。