启用3D透明度 - pyopengl

时间:2015-12-17 14:50:57

标签: python opengl 3d pyopengl

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

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

这几乎是有效的,具体如下: 如果我有两个对象obj1和obj2,并按此顺序将它们添加到窗口小部件,我将在obj1的后面看到obj2,但不是相反的。

我尝试以不同的顺序添加对象,但显然我会在obj2后面看到obj1,而不是相反。如何使这个对所有对象无动于衷?

1 个答案:

答案 0 :(得分:2)

深度测试和透明度不能很好地协同工作。

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

但是,由于obj2的深度更大,因此深度测试失败时不会绘制重叠像素 - 因此我们只会看到obj2的部分与obj1不重叠。

深度测试不考虑透明度。因此,为了使它过于有效,正如BDL在评论中所说的那样,您将不得不手动对对象进行排序并以正确的顺序绘制它们。