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
浙公网安备 33010602011771号