【问题标题】:Making a texture translucent in PyOpenGL在 PyOpenGL 中使纹理半透明
【发布时间】:2012-10-26 05:28:45
【问题描述】:

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

结果如下:

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

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

我已经为对象尝试了多种 glDepthFunc() 组合,但无济于事。问题与我处理深度、混合或其他方面的方式有关吗?

编辑:

在第一个示例中使用 glEnable(GL_CULL_FACE)glCullFace(GL_BACK) 会得到以下结果,但仍然不正确,因为现在您根本看不到球体的背面。

【问题讨论】:

    标签: python opengl textures pyopengl


    【解决方案1】:

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

    【讨论】:

    • 更近了,但还不够,因为我仍然看不到球体的背面。我将在问题中发布结果的图像。
    • 使用带有 alpha 值的纹理可能更容易。
    【解决方案2】:

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


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

    【讨论】:

    • glBlendFunc() 在两个示例中都设置为glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA)。纹理没有 alpha 通道,因为我希望在 draw 方法中设置它。
    • @StuGrey:啊,对,我确实错过了;你把它写在顶部的某个地方。小提示:始终在需要时设置状态。 OpenGL 没有得到“初始化”!
    猜你喜欢
    • 1970-01-01
    • 2020-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-07
    • 2016-02-20
    相关资源
    最近更新 更多