使深度缓冲区只读

7

使深度缓冲区只读的用途是什么?我在红皮书上读到,这种情况下需要先绘制不透明的对象,然后再绘制透明的对象。我已经测试过了,在两个相互覆盖的不透明对象上,结果很难解释,我也没有发现关于只读的有用信息。有人能解释一下吗?

1个回答

9

在某些情况下,这绝对是有意义的。以下是两个例子:

  1. 您可能会为图形使用非常昂贵的像素着色器。如果您这样做,您希望最小化需要进行着色的像素数量。为此,您可以首先将场景渲染到深度缓冲区中(禁用对颜色缓冲区的写入)。然后,您将深度缓冲区设置为只读,并启用颜色写入和深度比较模式设置为相等来渲染所有几何体。这确保了屏幕上的每个像素仅被绘制一次,您可以使用非常昂贵的像素着色器,同时仍然保持良好的帧速率。

  2. 透明度问题:如果您渲染透明(alpha-blended)三角形,则绘制顺序对最终图像有重大影响。为了获得好看的结果,一种可靠的方法是首先渲染所有不透明的几何体。然后禁用对深度缓冲区的写入,并按从后向前的顺序渲染所有透明内容。这将确保您的透明多边形始终按顺序绘制,而且它们不会干扰不透明的内容。

想象一下这种情况:

  • 相机位于街景中,您正在查看一家商店的窗户,里面有一些漂亮的东西。

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

  • 然后绘制商店内部。由于Z缓冲区,所有像素都将被丢弃,因为显卡认为像素不可见。

  • 最终您会得到一个完全错误的图像:一个窗户在前面......嗯......在您开始渲染之前,在您的图形记忆中存在的任何东西。

正如所说的:为了避免这种情况,您首先要使用深度测试和深度写入功能渲染所有不透明物体(商店内部)。然后,您使用深度测试并关闭深度写入功能来渲染窗户。这将解决此问题。

以下是一个示例,说明处理透明度出错的另一种方式(仔细查看地毯)。

enter image description here


感谢您的回答,对于这两种情况关闭深度缓冲区都是合适的。 - pooya
在您的第二种情况下,关闭深度缓冲区不会改变任何内容,因为您无论如何都要对多边形进行排序。 - Calvin1602
@calvin 我知道。我只是试图找到一张展示我所说的alpha-bugs的图片,而这张图片是我找到的最好的(虽然不正确)。我甚至在文本中都说了这一点。 - Nils Pipenbrinck
我认为关闭深度缓冲区可以解决当多个透明物体在同一z缓冲区中时出现的z-fighting问题,在您的第二种情况中,即在完全相同的位置上有不同颜色的窗户。 - hao li

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接