wiki链接
NPOT Texture
Rectangle Texture
之前一直使用的texpacker打包的pot纹理,官方推荐使用Npot的纹理,但是studio打包的也是Pot纹理啊。
测试出来确实是Npot占用的内存比Pot的要小。
Npot纹理大小是1024x1025RGBA8888是不是就使用1024x1025x4个字节呢?
不使用mipmaps的时候就是mipmaps的num是1的时候 cocos是否会转成1024x2048大小的纹理呢?
Rectangle Texture说他们是不同纹理类型
Rectangle textures are very special texture types.
They are two-dimensional, but they are not textures of the type GL_TEXTURE_2D.
They have their own separate texture type: GL_TEXTURE_RECTANGLE.
然后初始化要用
glTexImage2D(GL_TEXTURE_RECTANGLE, 0, internalformat, width, height, 0, format, type, data);
但是cocos加载的时候我发现并没有判断是否应该使用GL_TEXTURE_RECTANGLE而是直接用的GL_TEXTURE_2D
创建sprite的时候会初始化纹理走到Texture2D::initWithData
在Texture2D::initWithMipmaps
中
我看到初始化的方式是
if (mipmapsNum == 1)
{
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, _antialiasEnabled ? GL_LINEAR : GL_NEAREST);
}else
{
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, _antialiasEnabled ? GL_LINEAR_MIPMAP_NEAREST : GL_NEAREST_MIPMAP_NEAREST);
}
用NPOT的图片确实占用少了,但是为什么呢?测试平台是IOS
还要shader里面都是texture2d的类型啊,那使用shader的话是不是npot的纹理会转化成pot啊?
然后之前子龙的文章说IOS在使用POT的时候opengl会自动生成mipmap导致会增加33%的内存占用。
The mipmap chain will take 33% extra space,
as the mipmap chain approximates 1/3 extra -
see the below series where t is the size of the original
texture: = t + t/4 + t/16 + t/64 etc...
那么Android设备不会这样吧?
那么官方问什么推荐使用NPOT呢?Tips-amp-Tricks