加载paletted / atitc DDS时的Android Opengl ES纹理压缩问题(INVALID_ENUM)

时间:2011-08-30 12:57:17

标签: android opengl-es textures

目前我在Android上的OpenGL ES 1.0上加载DDS压缩纹理时遇到问题(使用Compressonator生成):每当我调用glCompressedTexImage2D时,我每次都会得到一个GL_INVALID_ENUM。这是有问题的代码:

gl.glCompressedTexImage2D(GL11.GL_TEXTURE_2D, -mipMapCount, GL11.GL_PALETTE4_RGBA8_OES, width, height, 0, tsz, texBuf);

变量tsz的计算方法是将纹理的pitchOrLinearSize连续划分为4,直到它为1个字节(我的纹理为方形)。 texBuf是ByteBuffer和mipMapCount。当我这样做时,我得到一个GL_INVALID_ENUM错误代码,没有任何加载。当我加载ATC压缩纹理(有一个adreno gpu)时也会出现同样的情况。

我正在使用模拟器(带有调色板纹理)和我的手机(基于MSM720x的芯片组,相当于HTC Magic,两种类型)进行测试无济于事。

以下是完整的违规代码:

                        ByteBuffer texBuf = ByteBuffer.allocateDirect(tsz);
                        int ld = fis.getChannel().read(texBuf);
                        if (ld == tsz) {
                            int id = newTextureID(gl);
                            gl.glBindTexture(GL11.GL_TEXTURE_2D, id);

                            // Set all of our texture parameters:
                            gl.glTexParameterf(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR_MIPMAP_NEAREST);
                            gl.glTexParameterf(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR_MIPMAP_NEAREST);
                            gl.glTexParameterf(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL11.GL_REPEAT);
                            gl.glTexParameterf(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL11.GL_REPEAT);

                            texBuf.position(0);
                            //gl.glCompressedTexImage2D(GL11.GL_TEXTURE_2D, -mipMapCount, GL11.GL_PALETTE4_RGBA8_OES, width, height, 0, tsz, texBuf);
                            gl.glCompressedTexImage2D(GL11.GL_TEXTURE_2D, -mipMapCount, GL11.GL_PALETTE4_RGBA8_OES, width, height, 0, pitchOrLinearSize, texBuf);

                            int err = gl.glGetError();

                            if (err == GL11.GL_INVALID_VALUE) {
                                Log.d("TDL-dds", "Error INVALID_VALUE");
                            } else if (err == GL11.GL_INVALID_ENUM) {
                                Log.d("TDL-dds", "Error INVALID_ENUM");
                            }

                            if (err != 0) {
                                int texs[] = new int[1];
                                texs[0] = id;
                                gl.glDeleteTextures(1, texs, 0);
                                return 0;
                            }
                            return id;
                        }

任何人都知道我为什么会遇到INVALID_ENUM的错误?

1 个答案:

答案 0 :(得分:0)

我认为你必须使用'GL_ATC_RGB_AMD'而不是'GL_PALETTE4_RGBA8_OES'

从这里获得:: http://www.brokenteapotstudios.com/android-game-development-blog/2011/07/android-atitc-atc-texture-encoding-and-performance.html