1

在我的场景中,我在一个球体中有一个立方体。我想将 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)andglCullFace(GL_BACK)给了我以下仍然不正确的信息,因为现在您根本看不到球体的背面。

启用剔除

4

2 回答 2

1

First, glEnable(GL_CULL_FACE). Draw the sphere once with glCullFace(GL_FRONT). Draw the cube (without culling). Lastly, draw the sphere again with glCullFace(GL_BACK).

于 2012-11-06T09:45:11.107 回答
1

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


编辑: 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 纹理。

于 2012-11-06T09:35:32.750 回答