一个简单的例子:要将一块圆形画在一块木板上,但是我希望圆形超出木板的部份不要被画出来。那么使用Stencil Test的做法就是:1. 先Render出木板,并在Render木板的同时将木板位置的的Stencil buffer设为 1 . 2. Render圆形在木板上,但是若是Stencil buffer不等于1,则将该Pixel Discard。若是Stencil buffer等于1,则继续绘制并将Stencil buffer设回0 像这样的形式,Stencil Test被运用在很多绘图技巧上。最重要的运用例如阴影(Shadow)的绘制。使用Stencil Test可以将阴影均匀且正确的绘制到被阴影遮盖的表面上。
Depth buffer的宽度通常是16bits~32bits,Stencil buffer是1~8bits。Depth buffer的宽度决定了深度测试的精确度。Stencil buffer的宽度决定其运用的自由度,越长的Stencil buffer可以表示越多种「状态」,例如上面例子的0 1分别代表已经绘制过和尚未绘制过的状态。
此外,从前的Depth buffer技术只有Z-buffer,Z-buffer有个问题是它对远方的物体精确度较低,因此可能会出现前后关系判断错误的情形。造成这个原因的主因,是Z值在Screen coordinate中做双线性内插(前一篇提过的)然而在Eye coordinate到Screen coordinate的变换是个非线性的变换。这就造成在Eye coordinate上的Z值是非线性的变化。因此在近处与远处的精确度就不一样了。因此我们引入了w-buffer的概念,W值其实是Z的倒数,它在Eye coordinate上是线性的变化。因此我们在Depth-Test中加入了w-buffer之后,就能够处理z-buffer在远处精确度不足的问题。
3.6.4Blending 混色,将目前的Pixel Color与framebuffer中已经绘制好的图形做不同比例的混色。这个比例可能由透明度决定,也可能由其他参数计算出来。实际上在这个Stage可能进行的Operation还有不少(例如Dithering),这里只是举出最常见的几种。
最后,将算出来的颜色结果写进framebuffer中,就完成了整个Rendering pipeline过程了。
|