目前我在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的错误?
答案 0 :(得分:0)
我认为你必须使用'GL_ATC_RGB_AMD'而不是'GL_PALETTE4_RGBA8_OES'