Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在3D-pyopengl中启用透明度_Python_Opengl_3d_Pyopengl - Fatal编程技术网

Python 在3D-pyopengl中启用透明度

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

我有一个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,而不是相反。我怎样才能使它对所有的对象都不起作用呢?

深度测试和透明度不能很好地结合在一起

假设我们绘制半透明对象
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
。我建议您阅读深度测试的工作原理,其中可能还包含有用的信息: