Android opengl 纹理损坏

标签 android opengl-es android-emulator

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

Android 4.1 reference rendering

上图是Android 4.1 Jelly Bean模拟器生成的引用效果图,一切正常。

Android 1.6

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

Android 1.6

第三张图片是在同一个模拟器中捕获的。不同的是,现在得分在右上角呈现。 Score 是一种位图字体,它的纹理是一个 alpha 蒙版。乐谱后渲染的所有内容都会失去其纹理。请注意,之前的屏幕截图还包含以相同方式呈现的位图字体(但使用不同的纹理)。

其中一台三星设备(我不记得型号了)也出现了类似的问题。本地板纹理被渲染时,一切都在失去纹理之后渲染。当我 a) 没有绑定(bind)纹理 b) 绑定(bind)了纹理,但没有使用它绘制三角形 c) 从头开始​​重新创建 png Assets 时,问题没有显现出来。

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 模拟器,还影响 2.x 系列的 android,尽管它没有那么突出(alpha 蒙版仍然呈现不正确)。所有 Assets 都正确加载为两个位图的幂。

最佳答案

  1. 我建议使用 32 位纹理,而不是灰度,而不是“alphamasks”(那是什么?)
  2. 检查纹理的大小,它不应超过最大大小 ( glGetInteger( GL_MAX_TEXTURE_SIZE )。还要确保纹理是 2 的幂。是的,你之前提到过它们,但如果它们在可缩放 Assets 中(drawable_x_dpi 文件夹),它们将由 android 进行缩放。为避免缩放,请将它们放入“原始”文件夹。
  3. 只是为了测试,尝试禁用所有过滤,包括 mipmaps - 将 GL_TEXTURE_WRAP_S 和 GL_TEXTURE_WRAP_T 设置为 GL_NEAREST

关于Android opengl 纹理损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12125763/

相关文章:

android - HistoryRecord 的 Activity 空闲超时?

android - 在 Android 上,应用程序在线程中运行无限循环时崩溃。

visual-studio - 更改 Visual Studio Emulator for Android vhd 安装路径

Android模拟器分配内存失败8

android - minSdkVersion 低于设备 API 版本的 INSTALL_FAILED_OLDER_SDK

android - 我想将 Scrollview 添加到 Button?

c++ - 如何在 Pi 上使用 OpenGL ES 在绘制到屏幕之前旋转纹理

android - 使用 NDK 编译链接(未复制)文件

c++ - OpenGL 4 和 ES 3.0 与 packHalf2x16/unpackHalf2x16 的差异

android - 模拟器错误(Android Studio)