OpenGL纹理在某些Android设备上有扭曲的颜色

时间:2014-08-15 00:34:02

标签: android opengl-es textures

我上传图片作为纹理加载到GLSurfaceView。 生成的纹理在某些设备上看起来非常精细,而在其他设备上看起来完全失真。

这就是三星Galaxy Nexus(屏幕密度2.0)的样子: enter image description here

摩托罗拉上的相同图像(屏幕密度为1.5):
enter image description here

这是我的加载代码:

FutureTask<Integer> futureTask = new FutureTask<Integer>(new Callable<Integer>() {
    @Override
    public Integer call() throws Exception {

        // Generate Texture
        int[] texturenames = new int[1];
        GLES20.glGenTextures(1, texturenames, 0);

        // Bind texture to texturename
        GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
        GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, texturenames[0]);

        // Set filtering
        GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER,
                GLES20.GL_LINEAR);
        GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER,
                GLES20.GL_LINEAR);

        // Set wrapping mode
        GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE);
        GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE);

        // Correct the bitmap if its not a power of two
        Bitmap potTextureBitmap = textureBitmap;
        int potWidth = nextPOT(textureBitmap.getWidth());
        int potHeight = nextPOT(textureBitmap.getHeight());
        if ((textureBitmap.getWidth() != potWidth) || (textureBitmap.getHeight() != potHeight)) {
            potTextureBitmap = Bitmap.createScaledBitmap(textureBitmap, potWidth, potHeight, false);
        }

        // Load the bitmap into the bound texture.
        GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, potTextureBitmap, 0);

        GLES20.glFlush();

        return Integer.valueOf( texturenames[0]);
    }
});

this.mSurfaceView.queueEvent(futureTask);

我做错了什么?

1 个答案:

答案 0 :(得分:0)

我终于找到了这个问题的原因。 它非常具体,但无论如何我都会分享细节:

我的颜色计算结果出现错误。我需要将Hex颜色转换为规范化的rgba(在我的情况下将白色#ffffffff转换为{1.0, 1.0, 1.0, 1.0}),但实际上我将非规范化值输入到我的着色器中(例如:{255, 255, 255, 255})。 当与我的纹理颜色相乘时,产生的颜色会爆炸。 这取决于图形卡,这会造成伪影。 因此,假设对屏幕分辨率的依赖纯属巧合!