what is RenderState? 初学directx或者xna的人可能会忽略这个概念。

实际上它是控制directX的一系列“全局变量”。通过改这些变量directx的绘制过程会产生不同的变化。在做特效的时候这些东西十分重要,包括shader编程的时候也可以在Technique中对RS进行指定以配合Shader

作为一种类似全局变量的东西,要注意何时修改何时恢复,否则很容易出现忘记恢复而导致其他地方的绘制出现奇怪的问题。

在XNA中它被集中成一个类方便更改,在DirectX9可以找到等价的类型

在opengl也有类似的东西(通过glEnable()和glDisable()),尤其opengl是按照状态机的形式设计的,所以也同样有大量的state可以控制。

下面介绍几个常用的RS。

 

Alpha系列

用于控制Alpha操作。例如在SpriteBatch的Begin方法执行时会对alpha系列RS修改,所以Begin方法提供了一个SaveState的选项,避免在SpriteBatch.Begin()修改RS后没有恢复过来

其中Alpha的操作又分AlphaBlend和AlphaTest。其中AlphaBlend就是平时说的透明度混合,可以把两张图的半透明部分合起来。而AlphaTest则是根据像素的Alpha决定这个像素是否要绘制。

--AlphaBlendEnable:是否开启透明度混合

--AlphaBlendOperation:决定两张图如何按照Alpha混合起来,可以是叠加(add),挑最大(max),等等

--AlphaDestinationBlend,AlphaSourceBlend,DestinationBlend, SourceBlend:这几个都决定了Alpha比较函数的参数权值

--AlphaTestEnable:是否开启AlphaTest

--AlphaFunction:用于AlphaTest的比较函数,例如可以用大于函数使得Alpha大于某值的像素绘制。


Fog系列

大概是在Dx9以及之前几个版本里头是有“硬件雾”的概念,就是让远处的物体颜色慢慢变淡(调alpha)直到最远看不见,以避免远处不显示的景物生硬的截开来。这个技术曾经非常流行,不过现在有了GPU编程,这种效果可以由Shader实现,所以DX10中已经没有Fog的身影。

FogColor, FogDensity, FogEnable, FogEnd, FogStart, FogTableMode, FogVertex

具体就不解释是什么了,并不难理解。


FillMode

有Point,Solid,WireFrame三种值,正常是Solid,如果你想所有东西都变成线框或者点,可以选WireFrame或Point

 

CullMode

指示directx在绘制的时候是否画背面,可以把顺时针或者逆时针其中一个方向认为是背面

 

Depth系列

深度缓冲由这系列的变量控制,要渲染深度图也必须要对这里进行控制

--DepthBufferEnable:是否允许深度缓冲

--DepthBufferFunction:用于测试一点是否画出来的函数,正常是LessOrEqual,也就是最近的东西画出来

--DepthBufferWriteEnable:是否允许写缓冲

 

Stencil系列

模板缓冲的控制变量,关于模板缓冲可以参考DirectX的介绍,主要是实现通过某些比较决定哪些像素会画出来,画出什么颜色来等等的效果。跟AlphaTest和DepthTest很相似,只不过比较函数的参数由你决定而已。

StencilEnable, StencilFunction:跟前面大同小异

StencilMask:决定比较函数的参数

StencilPass, StencilFail, StencilDepthBufferFail:这三个是同类的,分别代表当Stencil测试通过、失败、Stencil通过Depth失败这三种情况下分别要如何处理像素。

 

剩下的用的不算多,就不一一介绍了。完整的介绍可以看DirectX的MSDN

http://msdn.microsoft.com/en-us/library/bb147327%28VS.85%29.aspx

posted on 2009-04-05 20:03  中大信息中心数媒部  阅读(646)  评论(0)    收藏  举报