使深度缓冲区成为只读

时间:2010-08-08 07:46:22

标签: opengl

将深度缓冲区设为只读是什么用法?我在红皮书上看到,你需要首先绘制不透明的对象,然后是透明的对象。我已经测试了它,并且还测试了两个不透明的物体,结果很难解释,我发现没有任何关于使其成为只读的有用信息。有人可以解释一下吗?

1 个答案:

答案 0 :(得分:7)

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

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

  2. 透明度问题:如果渲染透明(alpha混合)三角形,绘图顺序会对最终图像产生显着影响。为了获得好看的结果,一种经过尝试和信任的方法是首先渲染所有不透明的几何体。然后禁用对深度缓冲区的写入,并渲染从后到前排序的所有透明内容。这将确保您的透明多边形始终按顺序绘制,并且它们不会干扰不透明的东西。

  3. 想象一下这个案子:

    • 相机在街景中,你正在商店里看到一个带窗户和一些好东西的商店。

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

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

    • 你最终会得到一个完全错误的图像:在你开始渲染之前,在你的图形记忆中出现的一个窗口......

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

    这是一个丑陋的例子。它显示了另一种处理透明度错误的方法(仔细看看地毯)。

    alt text