Opengl es 1.1,纹理压缩ETC1和Mipmaping(完整的mipmaps错误集)

时间:2011-08-18 11:43:19

标签: android opengl-es compression textures

当我在未压缩纹理上激活mipmaping时,一切都运行良好。

当我在ETC1纹理上执行时,纹理是空白的,当然因为没有给出完整的mipmap集。

代码非常简单,适用于iPhone(当然还有PVR压缩)。

它不适用于Android。 mipmap是使用外部工具构建的,并且一起过去。

我停止制作大小为4的mipmap,因为如果尝试使用较低的mipmap,glCompressedTexImage2D会返回一个opengl错误。

for(u32 i=0; i<=levels; i++)
{
    size = KC_TexByte(pagex, pagey, tex_type);
    glCompressedTexImage2D(GL_TEXTURE_2D, i, type, pagex, pagey, 0, size, ptr);

    pagex = MAX(pagex/2, 4);
    pagey = MAX(pagey/2, 4); 
    ptr += size;    

    KC_Error();    // test openGL error
}           

3 个答案:

答案 0 :(得分:2)

纹理为空白的原因是因为要求mipmap一直到1x1。

我认为你用小压缩纹理得到的错误是因为你试图使用的纹理格式(etc1?)不支持这些尺寸。您必须使用那些小尺寸的非压缩图像......

答案 1 :(得分:1)

谢谢,但你的解决方案不是正确的;我找到了另一个解决方案。

  1. 当你解释所有的mipmap都需要时,你是对的,直到大小为1x1
  2. 你错了,我们mipmap之间不能有不同的格式
  3. 正确的方法是:

    1. 使用尺寸为1x1
    2. 请记住它是使用bloc的压缩数据,因此BYTE中的大小每步不会超过4。在8x8之后,尺寸保持相同的值。

      sx = size in X
      sy = size in Y
      
      byte = ((sx+3)/4)*((sy+3)/4) * 8 * 2;       // 8 = bit per pixel
      

答案 2 :(得分:0)

for(u32 i=0; i<=levels; i++)

似乎您需要i < levels而不是<=