在Android上使用OpenGL ES显示透明纹理时出现问题

我现在已经投入了超过一天的时间寻找一个关于如何在Android上使用OpenGL渲染透明纹理的解决方案。 显然其他人比我有更多的运气,但尝试过各种解决方案后(例如OpenGL ES for Android中的透明纹理),我仍然无法完成。

这是我的基本设置:

        gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);
    gl.glClearColor(0.0f, 0.0f, 0.0f, 1);
    gl.glShadeModel(GL10.GL_FLAT);
    gl.glDisable(GL10.GL_DEPTH_TEST);
    gl.glEnable(GL10.GL_TEXTURE_2D);
    gl.glDisable(GL10.GL_DITHER);
    gl.glDisable(GL10.GL_LIGHTING);

    gl.glTexEnvx(GL10.GL_TEXTURE_ENV, GL10.GL_TEXTURE_ENV_MODE,
            GL10.GL_MODULATE);
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
    gl.glViewport(0, 0, w, h);
    gl.glMatrixMode(GL10.GL_PROJECTION);
    gl.glLoadIdentity();
    GLU.gluOrtho2D(gl, -ratio, ratio, -1, 1);

纹理通过...加载

    gl.glBindTexture(GL10.GL_TEXTURE_2D, textureName);

    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER,
            GL10.GL_NEAREST);
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER,
            GL10.GL_LINEAR);
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S,
            GL10.GL_CLAMP_TO_EDGE);
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T,
            GL10.GL_CLAMP_TO_EDGE);
    gl.glTexEnvf(GL10.GL_TEXTURE_ENV, GL10.GL_TEXTURE_ENV_MODE,
            GL10.GL_MODULATE);
    GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);

...并且有提示说这会导致由于预乘α而导致的问题。 但ReplicaIsland确实也使用GLUtils函数,并且游戏似乎没有透明图像的问题。

现在,如果我绘制具有alpha通道(PNG)的纹理,它们显得非常黑。 没有alpha的纹理在它们各自的颜色中被正确绘制)。 我没有运气应用各种glBlendFunc调用,即

    gl.glShadeModel(GL10.GL_FLAT);
    gl.glEnable(GL10.GL_BLEND);
        gl.glBlendFunc(GL10.GL_ONE, GL10.GL_ONE_MINUS_SRC_ALPHA);
    gl.glColor4x(0x10000, 0x10000, 0x10000, 0x10000);

我也试过这个

    gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);

结果始终是纹理根本不可见(完全透明?)。

从ReplicaIsland项目中使用用于测试的图像,这些是标准的PNG。 这也意味着所使用的纹理符合2规则的权力 - 在各种帖子中提供的另一种解决方案。 我看到一个区别就是ReplicaIsland似乎主要依赖于draw_texture扩展,而我必须使用VBOs(为了能够应用旋转)。

帮助将不胜感激! 谢谢Ben


好的,又一天的调试过去了,最后我发现了我的错误。 它与位图的颜色方案glBlendFunc或类似的东西无关。

GL_FLOAT在两个纹理函数调用中使用了GL_FIXEDGL_FLOAT

链接地址: http://www.djcxy.com/p/33997.html

上一篇: Problems displaying transparent textures with OpenGL ES on Android

下一篇: OpenGL: Overlay one texture over another and suppress white background