【问题标题】:Enable transparency in 3D - pyopengl在 3D 中启用透明度 - pyopengl
【发布时间】:2015-12-18 00:24:49
【问题描述】:

我有一个 GLViewWidget,我在其中添加了不同的对象 (GLMeshItem) 来设置这些属性,以启用透明度:

        opt = {
            GL_DEPTH_TEST: True,
            'glBlendFunc': (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA),
            }
        obj.setGLOptions(opt)

这几乎可以工作,在以下意义上: 如果我有两个对象 obj1 和 obj2,并按照这个顺序将它们添加到小部件中,我会在 obj1 的后面看到 obj2,但不是相反。

我尝试以不同的顺序添加对象,但显然我会看到 obj1 在 obj2 后面,而不是相反。我怎样才能让它对所有对象无动于衷?

【问题讨论】:

  • 您必须将它们从前排序并以正确的顺序绘制。
  • 但是正如我所说的两个对象都是透明的,所以我希望它们以相同的方式表现,即 obj2 显示在 obj1 后面,而 obj1 显示在 obj2 后面,这取决于我观察的点.
  • 唯一的方法(除了顺序无关的透明度)是根据它们的当前位置对每一帧中的对象进行排序并将它们拉回前面。

标签: python opengl 3d pyopengl


【解决方案1】:

深度测试和透明度不能很好地结合使用。

假设我们绘制你的半透明对象obj1。这也会将它的深度写入深度缓冲区。 现在假设我们要绘制第二个对象obj2,它的深度更大。我们希望我们会看到obj2obj1,因为obj1 是半透明的。

但是,由于obj2 的深度较大,重叠的像素将不会被绘制,因为深度测试失败 - 所以我们只会看到obj2 的部分未被obj1 重叠。

深度测试不考虑透明度。因此,正如 BDL 在 cmets 中所说,为了让它也能正常工作,您必须手动对对象进行排序并以正确的顺序绘制它们。

【讨论】:

  • 没有必要禁用深度测试。只有从后向前绘制对象时才能实现正确的混合,这意味着深度测试不再是问题。即使不排序,也必须至少启用深度测试并禁用深度写入。否则透明对象不会被非透明对象隐藏。
  • 你是对的,没有必要禁用它。编辑出来了。我的意思是说可能不再需要启用它。
  • 所以假设我首先在笛卡尔坐标(0,0,0)处绘制obj1,然后在笛卡尔坐标(2,0,0)处绘制obj2。如果我看x轴指向屏幕的场景,我会在透明的obj2后面看到obj1,这是正确的。但是如果我旋转场景,并用 x 轴指向屏幕内部来查看它,我是否应该再次对对象进行排序以便让 obj2 显示在透明 obj1 后面?
  • 是的。 obj2 的深度更大,所以如果你在第二种情况下先绘制obj1,由于深度测试,obj2 将不会被绘制。我建议您阅读深度测试的工作原理,这可能还包含有用的信息:opengl.org/wiki/Transparency_Sorting
猜你喜欢
  • 1970-01-01
  • 2012-10-26
  • 2013-10-07
  • 1970-01-01
  • 2021-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多