状态
Direct3D设备使用状态来配置所有的管道处理。采样器状态通过例如定义纹理寻址方式(texture addressing)和过滤模式控制纹理采样器设置。纹理状态设置用于控制纹理如何被组合以及相互之间如何混合的多重纹理混合器。渲染状态控制大多数管道状态。
状态块是存储和恢复状态的便利机制。
状态块保存和恢复状态
状态块是一组设备状态。设备状态由渲染状态,定点状态,像素状态,或上述的所有状态组成。状态块包含设备当前状态的快照,或你可以创建状态块来记录每一个应用程序造成的状态改变。
创建状态块
选择你想获取的状态类型,比功能照下面的方法创建状态块:
IDirect3DStateBlock9* pStateBlock = NULL;
pd3dDevice->CreateStateBlock(D3DSBT_ALL, &pStateBlock);
CreateStateBlock创建状态块,并且获取设备状态。设备状态由第一个参数中状态块类型指定。该状态可以为下面任一值:
l 所有的设备状态
l 所有的像素状态
l 所有的定点状态
获取状态信息
创建状态块自动获取当前设备状态。效果系统使用状态块保存状态。在调用Begin后,状态块被创建并且获取状态。当调用End,状态块中状态被重新应用于设备。
要保存自定义的状态序列,将你需要保存的状态更改序列包含在BeginStateBlock,EndStateBlock之间。BeginStateBlock通知当前的设备设置状态块并且将EndStateBlock调用之前发生的状态改变添加到其中。下面是例子:
IDirect3DStateBlock9* pStateBlock = NULL;
pd3dDevice->BeginStateBlock();
//这里发生任意数量的状态改变
//SetRenderState, SetSamplerState, SetTextureStageState…
pd3dDevice->EndStateBlock(&pStateBlock);
这将在自定义状态块中保存代码序列中任意数量的状态改变。之后,当你想要使用状态块重置设备状态时,调用IDirect3DStateBlock::Apply。这仅仅会覆盖状态块中义获取的设备状态。其他在自定义状态块中没有获取的设备状态不会改变。(记得在不需要使用状态块对象时调用Release)。
用状态块保存所有的设备状态
状态块可以用于获取所有的设备状态。下面是设备状态中包含的状态元素:
l 顶点状态;
l 像素状态;
l 每个纹理指定的采样器;
l 每个顶点纹理;
l 每个位移映射纹理(Each displacement map texture);
l 当前纹理的调色板;
l 对于每个顶点流:指向顶点缓存的指针,SetStreamSource中指定的每个参数和SetStreamSourceFreq指定的分配器(divider)(如果有);
l 指向索引缓存的指针;
l 视口;
l 裁剪矩形;
l 世界变换矩阵,视变换矩阵和投影矩阵;
l 纹理变换;
l 裁剪面(如果有);
l 当前材质;
要用状态块获取所有的状态对象,需在调用CreateStateBlock时使用D3DSBT_ALL作为第一个参数。
使用状态块保存顶点状态
状态块可以用于仅获取顶点状态。下面的状态为顶点状态:
l 顶点渲染状态;
l 顶点采样器器状态;
l 顶点纹理状态;
l SetNPatchMode中N面片(NPatch)模式片段;
l SetLight中每一个光源,包括LightEnable指定的光源是否开启的状态;
l 当前顶点着色器和每一个顶点着色器常量;
l 对于每个顶点流:保存SetStreamSourceFreq中指定的分配器(divider)值;
l 当前顶点声明(FVF)
使用状态块获取顶点状态,需在调用CreateStateBlock时为第一个参数指定D3DSBT_VERTEXSTATE。
顶点管道:渲染状态
设备渲染状态几乎影响管道的每一个部分的行为。渲染状态通过调用SetRenderState来设置。下面的表格包含设置顶点状态的所有渲染状态:
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 |
采样器状态控制采样相关的主题,如滤波,贴瓷和纹理坐标寻址模式。使用SetSamplerState设置采样器状态(包括在镶嵌器(tessellator)单元中用于采样位移映射(displacement maps)的采样器状态).采样器状态以”D3DSAMP_”为前缀重命名会导致从DirectX 8中移植的程序在编译时报错。
下面的表格包含设置顶点状态的所有采样器状态:
Sampler States |
Default Value |
D3DSAMP_DMAPOFFSET |
256 |
顶点管道:纹理状态
纹理状态控制多纹理混合器的纹理混合操作。使用SetTextureStageState来设置纹理状态。使用SetTexture将一个纹理对象与采样器层关联。
下面的表格包含设置顶点状态的所有纹理状态:
Texture States |
Default Value |
D3DTSS_TEXCOORDINDEX |
0 |
D3DTSS_TEXTURETRANSFORMFLAGS |
D3DTTFF_DISABLE |
D3DTSS_TEXCOORDINDEX是一个固定功能的定点处理状态。如果使用可编程的顶点着色器,该状态会被忽略。
使用状态块保存像素状态
状态块可以仅用于获取像素状态。下面的状态为像素状态:
l 像素渲染状态
l 像素纹理状态
l 像素采样器状态
l 当前像素着色器和每个像素着色器常量
使用状态块获取像素状态,需在调用CreateStateBlock时为第一个参数指定D3DSBT_PIXELSTATE。
像素管道:渲染状态
设备渲染状态几乎影响管道每一个部分的行为。调用SetRenderState设置渲染状态。
下面的表格包含设置像素状态的所有渲染状态:
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 |
0x 0000000f |
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 |
0x 0000000f |
D3DRS_COLORWRITEENABLE2 |
0x 0000000f |
D3DRS_COLORWRITEENABLE3 |
0x 0000000f |
D3DRS_BLENDFACTOR |
0xffffffff |
D3DRS_SRGBWRITEENABLE |
0 |
D3DRS_SEPARATEALPHABLENDENABLE |
FALSE |
D3DRS_SRCBLENDALPHA |
D3DBLEND_ONE |
D3DRS_DESTBLENDALPHA |
D3DBLEND_ZERO |
D3DRS_BLENDOPALPHA |
D3DBLENDOP_ADD |
像素管道:采样器状态
采样器状态控制采样相关的主题,如滤波,贴瓷和纹理坐标寻址模式。使用SetSamplerState设置采样器状态(包括在镶嵌器(tessellator)单元中用于采样位移映射(displacement maps)的采样器状态).采样器状态以”D3DSAMP_”为前缀重命名会导致从DirectX 8中移植的程序在编译时报错。
下面的表格包含设置像素状态的所有采样器状态:
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 |
像素管道:纹理状态
纹理状态控制多纹理混合器的纹理混合操作。使用SetTextureStageState来设置纹理状态。使用SetTexture将一个纹理对象与采样器层关联。
下面的表格包含设置像素状态的所有纹理状态:
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 |
渲染状态
设备渲染状态几乎影响管道每一个部分的行为。调用SetRenderState设置渲染状态。下面的主题包含了附加的信息。
- Alpha混合状态(Alpha Blending State)
- Alpha测试状态(Alpha Testing State)
- 环境光照状态(Ambient Lighting State)
- 反走样状态(Antialiasing State)
- 剔除状态(Culling State)
- 深度缓存状态(Depth Buffering State)
- 雾状态(Fog State)
- 光照状态(Lighting State)
- 轮廓和填充状态(Outline and Fill State)
- 单点颜色状态(Per-Vertex Color State)
- 图元裁剪状态(Primitive Clipping State)
- 着色状态(Shading State)
- 模板缓存状态(Stencil Buffer State)
- 纹理包装状态(Texture Wrapping State)
Alpha混合状态(Alpha Blending State)
色彩的Alpha值控制其透明度。开启Alpha混合允许平面上的颜色,材质和纹理以透明度混合到其他平面上。
更多信息参考Alpha纹理混合(Alpha Texture Blending)和纹理混合(Texture Blending)。
用C++编写的应用程序使用D3DRS_ALPHABLENDENABLE渲染状态开启Alpha透明度混合。Direct3D API允许多种Alpha混合类型。然而,需要注意用户的3D硬件并不一定支持所有Direct3D允许的混合状态。
Alpha混合类型的设定依赖于D3DRS_SRCBLEND和D3DRS_DESTBLEND渲染状态。需要成对使用源混合状态和目标混合状态。下面的代码举例说明如何将源混合状态设置为D3DBLEND_SRCCOLOR,将目标混合状态设置为D3DBLEND_INVSRCCOLOR。
//此代码假设d3dDevice为合法的IDirect3DDevice9接口指针
//设置源混合状态
d3dDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCCOLOR);
//设置目标混合状态
d3dDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCCOLOR);
改变源混合状态和目标混合状态会改变在布满雾或灰层的大气中的放射性物体的外观。例如,如果你的应用程序模拟在雾环境中的火焰,力场,等离子束或相似的放射性物质,将源混合状态和目标混合状态设置为D3DBLEND_ONE。
其他的Alpha混合应用程序用该状态来控制3D场景的光照,也称之为光照映射(light mapping)。根据源的Alpha信息,将源混合状态设置为D3DBLEND_ZERO并将目标混合状态设置为D3DBLEND_SRCALPHA使场景变暗。源图元在合适的时机被作为使帧缓存内容变暗比例的光照映射(The source primitive is used as a light map that scales the contents of the frame buffer to darken it when appropriate).这生成单色光照映射(This produces monochrome light mapping).
你可以通过将源Alpha混合状态设置为D3DBLEND_ZERO,把目标混合状态设置为D3DBLEND_SRCCOLOR来完成彩色光照映射。
Alpha测试状态(Alpha Testing State)
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测试。
环境光照状态(Ambient Lighting State)
环境光是环境从所有方向辐射的光线。要了解Direct3D如何使用环境光照,参考光照数学(Mathematics of Lighting)。
C++应用程序通过在调用SetRenderState方法时给第一个参数传递枚举值D3DRS_AMBIENT设置环境光颜色。第二个参数为颜色值。默认值为0。
d3dDevice->SetRenderState(D3DRS_AMBIENT, 0x00202020);
反走样(抗锯齿)状态(Antialiasing State)
反走样是使线或边缘在屏幕上外观更光滑的方法。默认情况下,Direct3D不执行反走样。要开启全屏反走样,设置D3DRS_MULTISAMPLEANTIALIAS渲染状态为TRUE。要关闭反走样则设置该渲染状态值为FALSE。
剔除状态(Culling State)
要改进渲染性能,你可以挑选(或删除)背离摄像机的图元面。对于单面图元,由于背面不可见,此方法节省了渲染时间。要开启剔出,你需要知道定点的环绕顺序(一般为逆时针)。此例子讲删除任何背面向前的图元(给定逆时针环绕顺序):
SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW);
深度缓存状态(Depth Buffering State)
深度缓存是删除隐藏线或隐藏面的方法。默认情况下,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)。
雾状态(Fog State)
舞化效果使得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)雾化模式的雾密度。
光照状态(Lighting State)
如果你不使用顶点着色器或像素着色器进行光照,你可以在运行时选择光照引擎。光照引擎要求顶点数据中包含每个顶点的法线;没有法线数据的顶点在光照计算时会发生点积为0的情况。光照计算在光照数学(Mathematics of lighting)中有更详细的介绍。
要开启光照引擎,使用:
SetRenderState(D3DRS_LIGHTING, TRUE);
轮廓和填充状态(Outline and Fill State)
没有纹理的图元使用由材质或顶点颜色指定的颜色进行渲染。你可以通过D3DFILLMODE中定义的枚举值为D3DRSFILLMODE渲染状态选择一个填充方法。
要开启抖动(dithering),应用程序需给SetRenderState的第一个参数传递D3DRS_DITHERENABLE枚举值。并设置第二个参数为TRUE以打开抖动,设为FALSE关闭抖动。
有时,在绘制直线的最后一个像素时会与周围的图元造成难看的重叠。你可以使用D3DRS_LASTPIXEL枚举值控制此情况的发生。然而,在装换该设置时需要仔细考虑。在某些情况下,禁止渲染最后一个像素会造成图元之间难看的裂缝。
对象轮廓可以通过设置合适的线绘模式来绘制。默认的画线状态为绘制实线。参考D3DX中的绘线支持(Line Drawing Support in D3DX )渲染状态获取更多信息。
逐点颜色状态(Per-Vertex Color State)
在执行光照时如果你告知运行时显示顶点颜色数据,Direct3D光照引擎会使用逐顶点颜色数据。通过开启下面的渲染状态:
//关闭逐点颜色渲染
SetRenderState(D3DRS_COLORVERTEX, FALSE);
//关闭逐点颜色渲染
SetRenderState(D3DRS_COLORVERTEX, TRUE);
如果逐点颜色被开启,应用程序可以配置系统获取顶点颜色信息的源。D3DRS_AMBIENTMATERIALSOURCE, D3DRS_DIFFUSEMATERIALSOURCE, D3DRS_EMISSIVEMATERIALSOURCE和D3DRS_SPECULARMATERIALSOURCE渲染状态分别控制环境光,漫反射光,发射光和镜面光颜色组成源。每一个状态可以被设置为定义指示系统为指定的颜色成份使用当前材质,漫反射色或镜面光颜色作为源的D3DMATERIALCOLORSOURCE枚举类型的成员。
图元裁剪状态(Primitive Clipping State)
部分位于(或完全在外)视锥台的图元会被裁减,仅渲染图元的可视部分。裁减使得仅渲染可见的图元或图元的可见部分,从而减少了大量工作。
要使用管道进行裁减,设置D3DRS_CLIPPING渲染状态为TRUE(默认值)来开启裁减或设置为FALSE关闭Direct3D裁减。
着色状态(Shading State)
Direct3D支持平面着色和高络德着色。默认为高络德着色。遥控制当前着色模式,C++应用程序需为D3DRS_SHADEMODE渲染状态指定一个D3DSHADEMODE枚举类型的成员。
下面的代码说明如何设置着色状态为平面着色模式:
d3dDevice->SetRenderState(D3DRS_SHADEMODE, D3DSHADE_FLAT);
模板缓存状态(Stencil Buffer State)
应用程序使用模板缓存来决定像素是否被写入目标平面。细节参看模板缓存技术(Stencil Buffer Techniques)。
纹理环绕状态(Texture Wrapping State)
D3DRS_WRAP0到D3DRS_WRAP7渲染状态为设备的多纹理层中多个纹理开启和关闭u环绕和v环绕(纹理u,v坐标)。你可以设置这些渲染状态为D3DWRAPCOORD_0,D3DWRAPCOORD_1, D3DWRAPCOORD_2和D3DWRAPCOORD_3标识的或值来开启纹理第一个,第二个,第三个和第四个方向的环绕。使用0关闭所有的环绕。默认情况下禁用所有纹理层所有方向的纹理环绕。