在PyOpenGL中使纹理半透明

2024-09-29 17:21:45 发布

您现在位置:Python中文网/ 问答频道 /正文

在我的场景中,我有一个球体内的立方体。我想应用一个RGB纹理到一个球体,使其半透明。我可以导入纹理,将其应用到球体并使其半透明,但我没有得到我想要的结果。在

我的混合函数是glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA)

我的画法如下:

def DrawGLScene():
    rotation1  = 60
    rotation2 = 60

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
    glEnable(GL_BLEND)
    glLoadIdentity()
    glTranslatef(0.0, 0.0, -8.0)
    glRotatef(rotation1, 1.0, 0.0, 0.0)
    glRotatef(rotation2, 0.0, 1.0, 0.0)
    glColor4f(1.0,1.0,1.0,1.0)

    glutSolidCube(2);
    glEnable(GL_COLOR_MATERIAL)
    glEnable(GL_TEXTURE_2D)
    glBindTexture(GL_TEXTURE_2D,1)
    glColor4f(1.0,1.0,1.0,0.3)
    Q=gluNewQuadric()
    gluQuadricNormals(Q, GL_SMOOTH)
    gluQuadricTexture(Q, GL_TRUE)
    glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP)
    glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP)
    gluSphere(Q, 2.35, 32, 16)
    glDisable(GL_TEXTURE_2D)

    glutSwapBuffers()

结果如下:

Cant see the back side of the sphere and artifacts on the sphere

似乎有深度问题,因为我只能在右下角看到球体的背面。然后,我将glDepthFunc(GL_LESS)设置为绘制立方体,并将glDepthFunc(GL_ALWAYS)设置为绘制球体,结果是:

Can now see the back of the sphere THROUGH the cube

现在球体的背面通过立方体显示出来。在

我尝试了多个glDepthFunc()组合来处理对象,但都没有用。问题是关于我如何处理深度,混合还是其他什么?在

编辑:

在第一个例子中使用glEnable(GL_CULL_FACE)glCullFace(GL_BACK)给了我以下仍然是不正确的,因为现在你根本看不到球体的背面。在

with culling enabled


Tags: alphasrcbufferbitcolor球体纹理gl
2条回答

首先,glEnable(GL_CULL_FACE)。用glCullFace(GL_FRONT)绘制一次球体。绘制立方体(无消隐)。最后,用glCullFace(GL_BACK)再次绘制球体。在

记住,混合和深度测试不能混合。进行混合时,始终必须手动将几何体从远到近排序。在光栅化器中,与顺序无关的通用透明度仍然是一个很大程度上尚未解决的问题。在


编辑:Op已经设置了混合函数。您必须设置混合函数。默认值是glBlendFunc(GL_ONE, GL_ZERO),这肯定不是您想要的。很可能您希望glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)用于常规的alpha通道纹理,或{}用于预乘的alpha纹理。在

相关问题 更多 >

    热门问题