当我激活未压缩纹理的贴图时,一切都很完美。
当我在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?)不支持这些大小。你必须使用那些小尺寸的非压缩图像…
谢谢,但你的解决方案不是正确的;我找到了另一个解决办法。
- 你是对的,当你解释说所有的mipmap是必需的,直到尺寸1x1
- 你错了,我们不能在mipmap 之间有不同的格式
正确的方法是:
- 将size设置为1x1
-
请记住,它是用块压缩的数据,所以字节的大小不会每一步除以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
而不是<=
。