在PyOpenGL中制作纹理半透明

时间:2012-11-06 09:25:52

标签: python opengl textures pyopengl

在我的场景中,我在一个球体内有一个立方体。我想将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

2 个答案:

答案 0 :(得分:1)

请记住,混合和深度测试不会混合。在进行混合时,您始终必须手动对几何体进行远近排序。通用订单独立透明度在光栅化器中仍然是一个很大程度上未解决的问题。


编辑:操作已经设置了混合功能。您必须设置混合功能。默认值为glBlendFunc(GL_ONE, GL_ZERO),这肯定不是您想要的。您最有可能希望glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)用于常规Alpha通道纹理,或glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)用于预乘alpha纹理。

答案 1 :(得分:1)

首先,glEnable(GL_CULL_FACE)。用glCullFace(GL_FRONT)绘制球体一次。绘制立方体(不剔除)。最后,使用glCullFace(GL_BACK)再次绘制球体。