1

我对 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。我哪里错了?

4

2 回答 2

0

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

于 2012-09-22T22:41:07.727 回答
0

谢谢吉姆·巴克。正如你所说。在某些设备上,jpg 必须被错误地解释,并且属于“如果没有 alpha”,但仍是 RGBA 格式。如果声明是不必要的,最好使用基本的 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 和实现的渲染器(样本取自“Android 无线应用程序开发,第二版”),基本的 texImage2D 就像一个魅力。

于 2012-09-24T17:48:45.583 回答