我有一个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,而不是相反。如何使这个对所有对象无动于衷?
答案 0 :(得分:2)
深度测试和透明度不能很好地协同工作。
假设我们绘制了半透明对象obj1
。这也会将其深度写入深度缓冲区。
现在假设我们想要绘制第二个对象obj2
,它具有更大的深度。我们希望我们看到obj2
到obj1
,因为obj1
是半透明的。
但是,由于obj2
的深度更大,因此深度测试失败时不会绘制重叠像素 - 因此我们只会看到obj2
的部分与obj1
不重叠。
深度测试不考虑透明度。因此,为了使它过于有效,正如BDL在评论中所说的那样,您将不得不手动对对象进行排序并以正确的顺序绘制它们。