【问题标题】:Android OpenGL ES Why JPG texture displays wrongly on some devices?Android OpenGL ES 为什么 JPG 纹理在某些设备上显示错误?
【发布时间】:2012-09-14 20:16:32
【问题描述】:

我对 OpenGL 完全陌生,所以请善待。 在我的应用程序中,我使用的是 JPG 和 PNG 纹理。在 HTC Desire (android 2.2) 或 Xperia x8 (android 2.1) 上一切正常,屏幕如下:http://imageshack.us/photo/my-images/534/xperia.png/)。但是在三星 Galaxy Tab 10.1 (android 3.2) 或三星 Galaxy S3 (android 4.x) 等较新的设备上,JPG 纹理是按颜色分隔的吗?并转移:http://imageshack.us/photo/my-images/855/samsungbs.png/。不过,PNG 始终显示正常。

我正在使用 GLSurfaceView 进行绘图。我负责制作纹理的代码如下所示:

gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[i]);
        gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_NEAREST);
        gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST);
        gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_REPEAT);
        gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_REPEAT);
        if (bitmaps[i].hasAlpha()) {
            GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, GL10.GL_RGBA, bitmaps[i], 0);
        } else {
            GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, GL10.GL_RGB, bitmaps[i], 0);
        }

通过“bitmaps[i].hasAlpha()”,我试图区分给定的位图是 jpg 还是 png。我哪里错了?

【问题讨论】:

  • 如果去掉 alpha 检查并同时使用 RGBA 会发生什么?
  • @Aetherna 您能否再次上传您的示例图片?链接已失效。我可能有类似的问题,如果我可以通过检查您的图像进行验证,那就太好了。非常感谢!

标签: android opengl-es png textures jpeg


【解决方案1】:

谢谢吉姆·巴克。 正如你所说。在某些设备上,jpg 必须被错误地解释,并且属于“如果没有 alpha”,但仍是 RGBA 格式。 这个 if 语句是不必要的,最好使用基本的 texImage2D 方法:

        gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[i]);
        gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_NEAREST);
        gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST);
        gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_REPEAT);
        gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_REPEAT);
        GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmaps[i], 0);

不过,在我之前的 ogl 配置中,纹理的颜色显示错误。所以下面是我的配置,它在我的所有设备上都运行良好。

    private void configureGL(GL10 gl) {
        gl.glDisable(GL10.GL_DITHER);
        gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);
        gl.glClearColor(1, 0, 0, 1);
        gl.glEnable(GL10.GL_CULL_FACE);
        gl.glShadeModel(GL10.GL_SMOOTH);
        gl.glEnable(GL10.GL_DEPTH_TEST);
        gl.glViewport(0, 0, screenWidth, screenHeight);
        gl.glMatrixMode(GL10.GL_PROJECTION);
        gl.glLoadIdentity();
        GLU.gluOrtho2D(gl, 0.0f, BASE_SCREEN_WIDTH, 0.0f, BASE_SCREEN_HEIGHT);
        gl.glEnable(GL10.GL_TEXTURE_2D);
        gl.glShadeModel(GL10.GL_FLAT);
        gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
        gl.glEnable(GL10.GL_ALPHA_TEST);
        //that's a temporal hack below for removing white borders around textures (not a good practice :P)
        gl.glAlphaFunc(GL10.GL_GREATER, 0.4f); 
    }

对于有类似问题的人:

之前,我使用自己的绘图线程并从头开始构建配置。这在某些设备上造成了奇怪的颜色,并让我使用了这个“if aplha”语句。现在,我使用 GLSurfaceView 和实现的 Renderer(示例取自“Android 无线应用程序开发,第二版”),基本的 texImage2D 就像一个魅力。

【讨论】:

    【解决方案2】:

    我猜这些不是 2 次幂纹理?如果是这样,也许它不工作的设备不能处理非 2 次幂纹理。这里肯定有对齐/间距的事情。

    【讨论】:

    • @Geobits :当我删除 alpha 检查时,没有任何反应。这个 alpha 是之前使用正确颜色显示进行战斗的结果 :(。Jim Buck :纹理是正方形的,是 2 的幂,或者存储在 nodpi 文件夹中,或者加载了“noScaling”选项。
    • 这看起来确实像一个 RGBA 图像,它被解释为 RGB 图像。图像中的形状被 1.3333333 倍“包裹”,这正是 RGBA-as-RGB 纹素阵列的样子。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多