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



当我激活未压缩纹理的贴图时,一切都很完美。

当我在ETC1纹理上这样做时,纹理是空白的,当然是因为没有给出完整的mipmaps集。

代码非常简单,可以在iPhone上运行(当然是使用PVR压缩)。

它不能在Android上工作。mipmap是使用外部工具构建的,并且是一起通过的。

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

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
}           

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

我可以想象,你得到的小压缩纹理的错误是因为纹理格式你试图使用(etc1?)不支持这些大小。你必须使用那些小尺寸的非压缩图像…

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

  1. 你是对的,当你解释说所有的mipmap是必需的,直到尺寸1x1
  2. 你错了,我们不能在mipmap
  3. 之间有不同的格式

正确的方法是:

  1. 将size设置为1x1
  2. 请记住,它是用块压缩的数据,所以字节的大小不会每一步除以4。在8x8之后,大小保持不变。

    sx = size in X
    sy = size in Y
    byte = ((sx+3)/4)*((sy+3)/4) * 8 * 2;       // 8 = bit per pixel
    
for(u32 i=0; i<=levels; i++)

似乎你想要i < levels而不是<=

最新更新