Android中的压缩ETC纹理更新 - glCompressedTexSubImage2D

时间:2012-07-15 13:36:01

标签: android opengl-es textures texture-mapping

我可以在Android中成功创建和加载ETC纹理, 使用电话:

ETC1Texture etc1tex = new ETC1Texture(...);
gl11.glCompressedTexImage2D(GL10.GL_TEXTURE_2D, 0/*level*/, 
                             ETC1.ETC1_RGB8_OES/*internal format*/,  
                 etc1tex.getWidth(), etc1tex.getHeight(),        
                 0/*border*/,   
                 etc1tex.getData().capacity()/*imagesize*/, 
                 etc1tex.getData());        

但现在我需要用新的图像数据更新这个纹理。 我正在使用SubImage的调用:

GL11.glCompressedTexSubImage2D( GL10.GL_TEXTURE_2D, 0/*level*/,                    
            0,   0,     etc1tex.getWidth(), etc1tex.getHeight(),        
            ETC1.ETC1_RGB8_OES, 
            etc1tex.getData().capacity(), 
            etc1tex.getData()); 

与前一次调用一样,或多或少采用相同的参数。 但它不起作用,我的纹理甚至没有改变。

但是如果我只是用第一个替换SubImage调用,我可以在更新时看到纹理中的一些失真......

有谁知道我如何使用这个CompressedTexSubImage调用

2 个答案:

答案 0 :(得分:2)

是的,我遇到了同样的问题。

我使用glCompressedTexImage2D(texinfo.glTarget + face, level,glInternalFormat, pixelWidth, pixelHeight, 0,faceLodSize, data);

它有效。

但是当我使用

glCompressedTexImage2D(texinfo.glTarget + face, level,glInternalFormat, pixelWidth, pixelHeight, 0,faceLodSize, NULL);

然后

glCompressedTexSubImage2D(texinfo.glTarget + face, level, 0, 0, pixelWidth , pixelHeight , glInternalFormat,faceLodSize, data);

它不起作用。

gl error is GL_INVALID_OPERATION

我需要使用glCompressedTexSubImage2D,因为我在一个缓冲区中加载一个纹理。 可以加载到多个tile缓冲区中。 如果已加载一个图块,则调用glCompressedTexSubImage2D来处理它。

答案 1 :(得分:0)

根据API(https://www.khronos.org/opengles/sdk/1.1/docs/man/glCompressedTexSubImage2D.xml

  

"所需的调色板格式不允许子图像更新,但是   扩展定义的其他格式可以。"

我认为这意味着对于ETC1压缩,不允许使用子图像。