|
发表于 2011-8-15 01:11:00
|
显示全部楼层
Re:后台缓存,深度缓存,模板缓存
1.
分辨率一样是指缓存的像素是一样的分辨率,如都是800*600、1024*768...等等。
他们的每个像素的位深度可以不同。
2.
后缓存里存放的是每个像素的颜色值。
3.
既然你提到龙书,那我就直接讲这个例子:
你说的这次绘制镜子其实是第二次绘制镜子了。因为在之前已经绘制一边镜子、墙壁和地板了(也就是说后缓冲里有这些东西了)。
为什么还要绘制第二遍呢? 就是为了更新模板缓冲。
是这样的,你仔细看看代码,在这次绘制之前已经设置了相关blend运算,让此次绘制不会更改后缓存的值(因为没有必要,后缓存里已经有了)。
重要的是:
Device->SetRenderState(D3DRS_STENCILENABLE, true);
Device->SetRenderState(D3DRS_STENCILFUNC, D3DCMP_ALWAYS);
Device->SetRenderState(D3DRS_STENCILREF, 0x1);
Device->SetRenderState(D3DRS_STENCILMASK, 0xffffffff);
Device->SetRenderState(D3DRS_STENCILWRITEMASK, 0xffffffff);
Device->SetRenderState(D3DRS_STENCILZFAIL, D3DSTENCILOP_KEEP);
Device->SetRenderState(D3DRS_STENCILFAIL, D3DSTENCILOP_KEEP);
Device->SetRenderState(D3DRS_STENCILPASS, D3DSTENCILOP_REPLACE);//这些代码的解释书中都有
这些代码让所有的“模板测试”都通过,并且通过后将缓存参考值设置为1。这会导致什么?
我们此次绘制了镜子(尽管没有绘制到后缓存上),但是所有绘制的部分在模板缓存相应的位置上的值都变成1了(之前整个模板都是0),这样就等于在模板上“标记”出了镜子所在的位置!!
然后再渲染茶壶时就会按照这些“标记”来绘制,这样除了镜子所在的位置,别处就不会画出茶壶了。
以上这些就是此实例的渲染过程。我觉得你并没有完全明白模板的含义,所以就详细解释了下。
4.
一般说的后缓存(如D3DFMT_A8R8G8B8等)就是储存了相关像素点的颜色(包含alpha值)。
深度缓存指相关像素的Z值。
模板缓存就是刚才说的标记用的那些东西。
后缓存要存颜色和alpha值,所以要用32位这么大,一般都单独使用一个buffer。
而深度缓存只是存Z值,不一定要占用32位这么多。模板用于标记,更是不用这么多位了(上面那个例子中实际只使用了1位)。所以常把深度缓存和模板缓存放在一起(24:8),这样就共用一个32位的buffer。
这三个缓存在逻辑上是三种东西。至于在硬件上是如何安排的,你现在还不用深入考虑这个。你只要知道:设置好一切,D3D会帮你管理好它们的。 |
|