Python 在3D-pyopengl中启用透明度
我有一个GLViewWidget,在其中我添加了不同的对象(GLMeshItem)来设置这些属性,以便启用透明度:Python 在3D-pyopengl中启用透明度,python,opengl,3d,pyopengl,Python,Opengl,3d,Pyopengl,我有一个GLViewWidget,在其中我添加了不同的对象(GLMeshItem)来设置这些属性,以便启用透明度: opt = { GL_DEPTH_TEST: True, 'glBlendFunc': (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA), } obj.setGLOptions(opt) 从以下意义上讲,这几乎是可行的: 如果我有两个对象obj1和o
opt = {
GL_DEPTH_TEST: True,
'glBlendFunc': (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA),
}
obj.setGLOptions(opt)
从以下意义上讲,这几乎是可行的:
如果我有两个对象obj1和obj2,并按此顺序将它们添加到小部件中,我将在obj1的后面看到obj2,但不是相反
我试图以不同的顺序添加对象,但很明显,我将在obj2后面看到obj1,而不是相反。我怎样才能使它对所有的对象都不起作用呢?深度测试和透明度不能很好地结合在一起 假设我们绘制半透明对象
obj1
。这也会将其深度写入深度缓冲区。
现在假设我们要绘制第二个对象,obj2
,它具有更大的深度。我们希望通过obj1
可以看到obj2
,因为obj1
是半透明的
但是,由于obj2
的深度更大,深度测试失败时不会绘制重叠像素-因此我们只会看到obj2
的部分没有被obj1
重叠
深度测试不考虑透明度。因此,为了让它也能正常工作,正如BDL在评论中所说,您必须手动对对象进行排序,并按正确的顺序绘制它们 您必须将它们前后排序,并按正确的顺序绘制。但正如我所说的,这两个对象都是透明的,因此我希望它们的行为方式相同,即obj2显示在obj1后面,obj1显示在obj2后面,这取决于我观察的点。唯一的方式(除了顺序无关的透明度之外)是根据对象的当前位置对每个帧中的对象进行排序,并将它们拉回到前面。不需要禁用深度测试。只有在从后向前绘制对象时才能实现正确的混合,这意味着深度测试不再是问题。即使不排序,也必须至少启用深度测试和禁用深度写入。否则透明对象将不会被非透明对象隐藏。你是对的,没有必要禁用它。把它删掉。我的意思是可能不再需要启用它,所以假设我首先在笛卡尔坐标(0,0,0)处绘制obj1,然后在笛卡尔坐标(2,0,0)处绘制obj2。如果我在x轴指向屏幕的情况下查看场景,我将看到透明obj2后面的obj1,这是正确的。但是,如果我旋转场景,并在x轴指向屏幕内部的情况下观察它,我是否应该再次对对象进行排序,以便在透明的obj1后面显示obj2?是的
obj2
具有更大的深度,因此如果在第二个场景中首先绘制obj1
,则由于深度测试,将不会绘制obj2
。我建议您阅读深度测试的工作原理,其中可能还包含有用的信息: