在我的场景中,我有一个球体内的立方体。我想应用一个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)
给了我以下仍然是不正确的,因为现在你根本看不到球体的背面。在
首先,
glEnable(GL_CULL_FACE)
。用glCullFace(GL_FRONT)
绘制一次球体。绘制立方体(无消隐)。最后,用glCullFace(GL_BACK)
再次绘制球体。在记住,混合和深度测试不能混合。进行混合时,始终必须手动将几何体从远到近排序。在光栅化器中,与顺序无关的通用透明度仍然是一个很大程度上尚未解决的问题。在
编辑:Op已经设置了混合函数。您必须设置混合函数。默认值是}用于预乘的alpha纹理。在
glBlendFunc(GL_ONE, GL_ZERO)
,这肯定不是您想要的。很可能您希望glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
用于常规的alpha通道纹理,或{相关问题 更多 >
编程相关推荐