Android opengl纹理损坏

我在Android模拟器上遇到纹理损坏问题(它在大多数Android设备上运行良好)。

Android 4.1参考渲染

上面的图片是运行Android 4.1 Jelly Bean的模拟器生成的参考渲染,看起来应该是一切。

Android 1.6

第二张图片在运行Android 1.6的模拟器中捕获。 请注意某些禁用的工具栏按钮的损坏(它们以颜色1f,1f,1f,0.5f呈现)

第三张照片在同一个模拟器中捕获。 不同之处在于现在得分显示在右上角。 Score是一个位图字体,它的纹理是一个alpha蒙版。 在比分之后呈现的所有东西都松动了它的质感。 请注意,以前的屏幕截图还包含以相同方式呈现的位图字体(但使用不同的纹理)。

其中一个三星设备上出现了类似的问题(我不记得该型号)。 渲染地面纹理时,渲染后的所有内容都会丢失纹理。 当我或者a)没有绑定纹理时,问题并没有表现出来b)绑定了纹理,但没有使用三角形c)重新创建了png资产。

Opengl设置:

gl.glDisable(GL10.GL_LIGHTING);
gl.glDisable(GL10.GL_CULL_FACE);
gl.glDisable(GL10.GL_DEPTH_TEST);
gl.glDisable(GL10.GL_DITHER);
gl.glDepthMask(false);
gl.glEnable(GL10.GL_TEXTURE_2D);
gl.glBlendFunc(GL10.GL_ONE,GL10.GL_ONE_MINUS_SRC_ALPHA);
gl.glShadeModel(GL10.GL_FLAT);
gl.glTexEnvf(GL10.GL_TEXTURE_ENV, GL10.GL_TEXTURE_ENV_MODE, GL10.GL_MODULATE);

如何加载纹理:

public void doGLLoading(Engine renderer) {
        GL10 gl=renderer.getGl();
        int[] ids=new int[1];
        gl.glGenTextures(1, ids,0);
        id=ids[0];
        gl.glBindTexture(GL10.GL_TEXTURE_2D, id);
        Log.d("SpriteDraw", String.format("Texture %s has format %s",getPath(),bitmap.getConfig().toString()));
        buildMipmap(gl, bitmap);
        gl.glTexParameterf(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_MIN_FILTER, minFilter);
        gl.glTexParameterf(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_MAG_FILTER, magFilter);
        gl.glTexParameterf(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_WRAP_S, textureWrapS);
        gl.glTexParameterf(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_WRAP_T, textureWrapT);
    }
private void buildMipmap(GL10 gl, Bitmap bitmap) {
    int level = 0;
    int height = bitmap.getHeight();
    int width = bitmap.getWidth();

    while (height >= 1 || width >= 1) {
        // First of all, generate the texture from our bitmap and set it to
        // the according level
                    //TextureUtils.texImage2D(gl, GL10.GL_TEXTURE_2D, level, -1, bitmap, -1, 0);
        GLUtils.texImage2D(GL10.GL_TEXTURE_2D, level, bitmap, 0);
        if (height == 1 || width == 1) {
            break;
        }
        // Increase the mipmap level
        level++;
        height /= 2;
        width /= 2;
        Bitmap bitmap2 = Bitmap.createScaledBitmap(bitmap, width, height,
                true);

        // Clean up
        bitmap.recycle();
        bitmap = bitmap2;
    }
}

注意:字体使用gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);GL10.glDrawArrays 。 腐败不仅会影响1.6模拟器,还会影响android的2.x系列,尽管它不如突出(alpha掩码仍然渲染不正确)。 所有资产都正确加载为两个位图的权力。


  • 我建议使用32位纹理,而不是灰度,而不是“alphamasks”(那是什么?)
  • 检查你的纹理的大小,它不应该超过最大尺寸(glGetInteger(GL_MAX_TEXTURE_SIZE)。也可以让你的纹理的权力是2.是的,你提到他们之前,但如果他们在可伸缩资产(drawable_x_dpi文件夹),他们将被android缩放。为了避免缩放,把它们放到“raw”文件夹中。
  • 仅用于测试,请尝试禁用所有过滤功能,包括mipmap - 将GL_TEXTURE_WRAP_S和GL_TEXTURE_WRAP_T设置为GL_NEAREST
  • 链接地址: http://www.djcxy.com/p/87143.html

    上一篇: Android opengl texture corruption

    下一篇: OpenGL ES 1.1 multiple textures per mesh