模板的概念及工作原理

 模板缓冲(Stencil Buffer)用来控制是否一个像素一个像素地向渲染目标表面绘制场景。在模板缓冲最基本的一级上,它能够使程序掩盖住被渲染图像的一部分,使它不能显示。

  模板缓冲区是一个记录每个像素信息的附加的缓冲区,很像一个z缓冲区。实际上,该缓冲区就驻留在z缓冲区的某些位中。常见的模板/z缓冲区格式为15位的z和1位的模板,或24位的z和8位的模板,如图7 -1如示。在描绘多边形时,可以针对每个像素,对模板的内容进行简单的数学操作。例如,可以增加或减少模板缓冲区,或在模板值没能通过一项简单的比较测试时,拒绝绘制像素。可以将帧缓冲区的一个区域标出,然后只对标出(或未标出)的区域进行描绘。上述操作对于此类效果十分有用,各种体积效果就是很好的例子,比如阴影量。


图7-1 模板的存储格式

  模板缓冲的工作原理也类似于深度缓冲。模板缓冲发挥作用的时机是在所有的3D模型已投影到了目标缓冲区后。这样做的原因是模板会对每一个将要绘制的像素进行模板测试,模板测试使用模板参考值、模板掩码、模板比较函数,以及当前像素对应的模板缓冲区的模板值作为参数。在测试后,会根据测试结果对模板缓冲中的值做出适当的处理。最后在渲染出最终的效果时,系统会根据模板缓冲的值做出适当的渲染效果。可以看出,模板缓冲技术的本质和深度缓冲比较类似,都是提供一个标准进行比较,从而决定是否显示某个像素。其工作过程可参见图7-2。

  Direct3D在模板缓冲上执行一个基于 pixel-by-pixel的测试。对于目标表面上的每一个像素,它使用模板缓冲中相应的值——模板参考值(stencil reference value)和模板掩模值(stencil mask value)来执行测试。如果测试通过,Direct3D就会执行一个动作。测试使用下面的步骤来进行:
  (1)将模板参考值与模板掩模进行逐位AND运算;
  (2)将当前像素的模板缓冲置于模板掩模进行逐位AND运算;
  (3)用比较函数比较前两步得到的结果。

  如果写成伪代码形式,步骤如下:
  (StencilRef & StencilMask) CompFunc
  (StencilBufferValue & StencilMask)

  上式中,StencilBufferValue是当前像素的模板缓冲的内容;伪代码使用&符号来表示逐位AND操作;StencilMask表示模板掩模的值;StencilRef表示模板参考值;CompFunc是比较函数。


图7-2 模板的工作过程

  如果模板测试通过了,那么当前像素就会被写到目标表面;如果没有通过,则会将当前像素忽略掉。默认的比较行为是无论每个逐位操作得到什么结果,都执行写像素操作(D3DCMP_ALWAYS标志)。可以改变D3DRENDERSTATE_STENCILFUNC渲染状态来改变这一行为,通过传递D3DCMPFUNC枚举类型的一个成员来声明所需的比较函数。

你可能感兴趣的:(Direct3D,OpenGL,技术理论)