2010-08-08 121 views
6

使深度缓冲区只读的用法是什么?我读过红皮书,你需要首先绘制不透明物体,然后是透明物体。我已经测试过了,并且还测试了两个不透明的对象,结果很难解释,并且我没有发现使它成为只读的有用的东西。有人能解释一下吗?使深度缓冲区只读

回答

7

这在某些情况下绝对有意义。这里有两个:

  1. 您可能会使用非常昂贵的像素着色器为您的图形。如果你这样做,你想最大限度地减少需要阴影的像素数量。为此,您可以先将场景渲染到深度缓冲区(禁止写入颜色缓冲区)。然后,将深度缓冲区设置为只读,并将所有几何体的颜色写入启用并将深度比较模式设置为相等。这可以确保屏幕上的每个像素都被精确绘制一次,并且您仍然可以使用昂贵的像素着色器,同时仍保持良好的帧速率。

  2. 透明度问题:如果渲染透明(alpha-blended)三角形,则绘制顺序会对最终图像产生重大影响。为了获得好看的结果,尝试和可信的方式是首先渲染所有不透明的几何图形。然后禁用写入深度缓冲区并渲染所有透明的东西从后到前排序。这将确保您的透明多边形总是按顺序绘制,并且不会干扰不透明的东西。

试想一下这种情况:

  • 相机是在街头场景,你是在寻找一个窗口,里面铺了一些不错的东西的商店。

  • 您首先绘制透明窗口 - 启用深度写入。

  • 然后你画车间的内部..由于Z缓冲所有像素将被丢弃,因为显卡认为像素不可见。

  • 最终会出现一个完全错误的图像:在...开始前的一个窗口...以及在开始渲染之前在您的图形内存中的任何内容。

如上所述:为了解决这个问题,首先将所有不透明的东西(商店内部)渲染为深度测试和深度。然后,渲染窗口并进行深度测试并深度写入。这将解决这个问题。

下面是一个这样的事情是多么丑陋的例子。它显示了另一种处理透明度错误的方式(仔细观察地毯)。

alt text

+0

感谢您的回答,对于关闭深度缓冲区的两种场景都是健全的。 – pooya 2010-08-08 10:54:52

+0

在第二种情况下,关闭深度缓冲区不会改变任何东西,因为您仍然对多边形进行排序。 – Calvin1602 2010-08-08 17:57:13

+0

@calvin我知道。我试图找到一张照片,显示我正在谈论的这个alpha-bugs,这张图片是我发现的最好的(虽然不是正确的)..我甚至在我认为的文字中这样说过 – 2010-08-08 18:37:41