禁用从glsl写入深度缓冲区

时间:2012-01-12 09:48:53

标签: opengl glsl alphablending depth-buffer

所有几何体都存储在一个VBO中(透明+不透明)。我不能排序几何。如何在不丢失数据颜色的情况下禁止从glsl写入深度缓冲区?

2 个答案:

答案 0 :(得分:5)

如果我理解正确,您希望禁用深度写入,因为您绘制了不透明和透明对象。除了它在GLSL中不起作用的事实之外,它不会产生你想要的东西,如果它的话。

如果您刚刚禁用深度写入 ad hoc ,则无论z顺序如何,透明对象之后的不透明对象都会覆盖它。

你真正想做的是:

  1. 启用深度写入和深度测试
  2. 绘制所有不透明几何体。如果可以的话,在粗略排序(粗略足够好!)的顺序中,最先是最近的对象。
  3. 禁用深度写入,启用深度测试
  4. 启用混合
  5. 绘制透明对象,按相反方向排序,首先是最远的。这会遮挡具有不透明几何体的透明对象,并使混合正常工作。
  6. 如果出于某种原因,你无法对不透明的几何体进行排序(虽然你真的没有理由不能这样做?),没关系 - 它会稍慢一些因为它不会剔除碎片,但它会产生相同的图像。

    如果出于某种原因,您无法对透明几何体进行排序,则必须预期多个透明对象重叠的结果不正确。这可能会或可能不会引人注意(特别是如果订单是“随机的”,即逐帧更改,它将是非常明显的 - 否则你可能实际上可以逃脱它虽然它是不正确的。)

    请注意,正如datenwolf已经指出的那样,几个对象在一个VBO中的事实并不意味着你不能以任何你想要的顺序绘制它们的子集或几个子集。毕竟,一个VBO只保存一些顶点,由你按哪个顺序绘制哪些组。

答案 1 :(得分:0)

你不能。

  

我不能对几何进行排序。

为什么呢?你认为因为它都在一个VBO中?然后我得到了一个好消息:完全可以从缓冲区对象的一个​​子集中进行绘制。