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

标签 android opengl-es transparency textures vbo

我已经投入了超过一天的时间来寻找有关如何在 Android 上使用 OpenGL 渲染透明纹理的解决方案。显然其他人的运气比我好,但在尝试了各种解决方案(例如 Transparent texture in 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);

... 并且有迹象表明这会由于预乘 alpha 而导致问题。但是ReplicaIsland确实也使用了GLUtils功能,游戏似乎没有透明图像的问题。

现在,如果我使用 alpha channel (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 扩展,而我必须使用 VBO(以便能够应用旋转)。

帮助将不胜感激! 谢谢 本

最佳答案

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

我原来是在两次纹理函数调用中草率地使用了 GL_FIXEDGL_FLOAT

关于android - 在 Android 上使用 OpenGL ES 显示透明纹理时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4557973/

相关文章:

android - 基于android中的大文本布局变化

java - Android:执行一个方法并在超时后终止它

android - glDiscardFrameBufferEXT 在 Android 中未定义,是否有等效项?

iphone - OpenGL ES [CAEAGLLayer] 内容的高分辨率视网膜显示屏幕截图

php - 检查图像是否为白色;如果是这样,请使其透明

android - PDF 有时无法在 Android 上使用谷歌嵌入式查看器加载

android - 底部 View 被顶部 View 遮挡

android - Android OpenGL ES 中的灰度颜色深度

css - 为固定/'sticky' 菜单调整整个网站上部区域

c# - 使用 C# 去除图像中的透明度