Opengl 禁用从glsl写入深度缓冲区

Opengl 禁用从glsl写入深度缓冲区,opengl,glsl,alphablending,depth-buffer,Opengl,Glsl,Alphablending,Depth Buffer,所有几何图形都存储在一个VBO中(透明+不透明)。我无法对几何进行排序。如何在不丢失数据颜色的情况下禁用从glsl写入深度缓冲区?您不能 我无法对几何进行排序 为什么??你认为这一切都在一个VBO里?然后我得到了一个好消息:完全可以从缓冲区对象的一个子集进行绘制。你不能 我无法对几何进行排序 为什么??你认为这一切都在一个VBO里?然后我得到了一个好消息:完全可以仅从缓冲区对象的子集进行绘制。如果我理解正确,您希望禁用深度写入,因为您同时绘制不透明和透明对象。除了它在GLSL中不能以这种方式工作

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

您不能

我无法对几何进行排序

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

你不能

我无法对几何进行排序


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

如果我理解正确,您希望禁用深度写入,因为您同时绘制不透明和透明对象。除了它在GLSL中不能以这种方式工作之外,它不会产生你想要的东西,如果它能产生的话

如果您只是禁用了“深度临时写入”,则透明对象后面的不透明对象将覆盖它,而不管z顺序如何

您真正想做的是:

  • 启用深度写入和深度测试
  • 绘制所有不透明几何体。如果可以的话,按照大致排序的顺序(大致就足够了!)首先选择最近的对象
  • 禁用深度写入,保持启用深度测试
  • 启用混合
  • 绘制透明对象,按相反方向排序,第一个距离最远。这将使用不透明几何体遮挡透明对象,并使混合正常工作
  • 如果出于某种原因,您无法对不透明几何体进行排序(尽管您确实没有理由不能这样做),没关系——它会稍微慢一点,因为它不会剔除碎片,但会生成相同的图像

    如果由于某种原因,无法对透明几何体进行排序,则在多个透明对象重叠的情况下,您将不得不预期不正确的结果。这可能是显而易见的,也可能不是显而易见的(特别是如果顺序是“随机的”,即一帧一帧地改变,这将是非常明显的——否则,尽管它是不正确的,但实际上您可能会侥幸逃脱)


    请注意,正如DatenWalf已经指出的那样,多个对象位于一个VBO中并不意味着您不能绘制它们的子集,也不意味着您不能按任何顺序绘制多个子集。毕竟,VBO只保存一些顶点,由您决定按哪个顺序绘制它们的哪些组。

    如果我理解正确,您希望禁用深度写入,因为您同时绘制不透明和透明对象。除了它在GLSL中不能以这种方式工作之外,它不会产生你想要的东西,如果它能产生的话

    如果您只是禁用了“深度临时写入”,则透明对象后面的不透明对象将覆盖它,而不管z顺序如何

    您真正想做的是:

  • 启用深度写入和深度测试
  • 绘制所有不透明几何体。如果可以的话,按照大致排序的顺序(大致就足够了!)首先选择最近的对象
  • 禁用深度写入,保持启用深度测试
  • 启用混合
  • 绘制透明对象,按相反方向排序,第一个距离最远。这将使用不透明几何体遮挡透明对象,并使混合正常工作
  • 如果出于某种原因,您无法对不透明几何体进行排序(尽管您确实没有理由不能这样做),没关系——它会稍微慢一点,因为它不会剔除碎片,但会生成相同的图像

    如果由于某种原因,无法对透明几何体进行排序,则在多个透明对象重叠的情况下,您将不得不预期不正确的结果。这可能是显而易见的,也可能不是显而易见的(特别是如果顺序是“随机的”,即一帧一帧地改变,这将是非常明显的——否则,尽管它是不正确的,但实际上您可能会侥幸逃脱)


    请注意,正如DatenWalf已经指出的那样,多个对象位于一个VBO中并不意味着您不能绘制它们的子集,也不意味着您不能按任何顺序绘制多个子集。毕竟,VBO只保存一些顶点,这取决于您以何种顺序绘制其中的哪些组。

    我应该在下一个规则中缩短VBO中的多边形:检测不透明多边形并在VBO的开头移动HI,然后绘制。是吗?我应该在下一个规则中缩短vbo中的多边形:检测不透明的多边形并在vbo的开头移动HI,然后绘制。是吗?我不明白为什么客户端代码上会有这样的负担。在自动处理片段之后,这样做要容易上千倍,而且在不涉及CPU计算的情况下,会大大提高性能。我越来越确信OpenGL在编写越来越愚蠢的标准时不会使用他们的大脑。@lukasz1985:之所以如此沉重,是因为你只有一个深度值。具有透明对象的场景在对象重叠的每个片段中具有多个深度,但只能保留一个深度(最接近眼睛的不透明深度)。对于透明对象,它们在任何给定片段上绘制的Z顺序没有很好的定义(OpenGL无法预先知道),但这对结果非常重要。因此,您必须在应用程序级别对它们进行排序。使用原子操作系统和“fat”缓冲区,可以实现您设想的“千倍容易”的方式,但这有巨大的需求。。。。。。在内存和带宽上,它只在最新的硬件上运行,而且这两者都不是一件小事(参见类似的例子)。OpenGL也必须考虑到不是顶级的硬件,而且当你没有两位数千兆字节的视频内存可用时,它仍然必须工作。因此,不幸的是,它不可能是进化的全部。@lukasz1985:嗯,不。。。“高级”意味着对纹理和缓冲区对象进行原子操作,在帧缓冲区中实现每个片段的链表,并在着色器中对它们进行排序。那种简单的东西。如果你想要可预测的、可复制的,这真的不是那么容易