使深度缓冲区只读的用途是什么?我在红皮书上读到,这种情况下需要先绘制不透明的对象,然后再绘制透明的对象。我已经测试过了,在两个相互覆盖的不透明对象上,结果很难解释,我也没有发现关于只读的有用信息。有人能解释一下吗?
使深度缓冲区只读的用途是什么?我在红皮书上读到,这种情况下需要先绘制不透明的对象,然后再绘制透明的对象。我已经测试过了,在两个相互覆盖的不透明对象上,结果很难解释,我也没有发现关于只读的有用信息。有人能解释一下吗?
在某些情况下,这绝对是有意义的。以下是两个例子:
您可能会为图形使用非常昂贵的像素着色器。如果您这样做,您希望最小化需要进行着色的像素数量。为此,您可以首先将场景渲染到深度缓冲区中(禁用对颜色缓冲区的写入)。然后,您将深度缓冲区设置为只读,并启用颜色写入和深度比较模式设置为相等来渲染所有几何体。这确保了屏幕上的每个像素仅被绘制一次,您可以使用非常昂贵的像素着色器,同时仍然保持良好的帧速率。
透明度问题:如果您渲染透明(alpha-blended)三角形,则绘制顺序对最终图像有重大影响。为了获得好看的结果,一种可靠的方法是首先渲染所有不透明的几何体。然后禁用对深度缓冲区的写入,并按从后向前的顺序渲染所有透明内容。这将确保您的透明多边形始终按顺序绘制,而且它们不会干扰不透明的内容。
想象一下这种情况:
相机位于街景中,您正在查看一家商店的窗户,里面有一些漂亮的东西。
首先绘制透明窗户 - 启用深度写入。
然后绘制商店内部。由于Z缓冲区,所有像素都将被丢弃,因为显卡认为像素不可见。
最终您会得到一个完全错误的图像:一个窗户在前面......嗯......在您开始渲染之前,在您的图形记忆中存在的任何东西。
正如所说的:为了避免这种情况,您首先要使用深度测试和深度写入功能渲染所有不透明物体(商店内部)。然后,您使用深度测试并关闭深度写入功能来渲染窗户。这将解决此问题。
以下是一个示例,说明处理透明度出错的另一种方式(仔细查看地毯)。