使用此方法加载纹理会消耗多少内存?
使用这种方法,1024x1024纹理会消耗4MB吗? (无论是将其加载为RGBA4444)?
-(void)loadTexture:(NSString*)nombre {
CGImageRef textureImage =[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:nombre ofType:nil]].CGImage;
if (textureImage == nil) {
NSLog(@"Failed to load texture image");
return;
}
// Dimensiones de nuestra imagen
imageSizeX= CGImageGetWidth(textureImage);
imageSizeY= CGImageGetHeight(textureImage);
textureWidth = NextPowerOfTwo(imageSizeX);
textureHeight = NextPowerOfTwo(imageSizeY);
GLubyte *textureData = (GLubyte *)calloc(1,textureWidth * textureHeight * 4);
CGContextRef textureContext = CGBitmapContextCreate(textureData, textureWidth,textureHeight,8, textureWidth * 4,CGImageGetColorSpace(textureImage),kCGImageAlphaPremultipliedLast );
CGContextDrawImage(textureContext, CGRectMake(0.0, 0.0, (float)textureWidth, (float)textureHeight), textureImage);
/**************** Convert data to RGBA4444******************/
//Convert "RRRRRRRRRGGGGGGGGBBBBBBBBAAAAAAAA" to "RRRRGGGGBBBBAAAA"
void *tempData = malloc(textureWidth * textureHeight * 2);
unsigned int* inPixel32 = (unsigned int*)textureData;
unsigned short* outPixel16 = (unsigned short*)tempData;
for(int i = 0; i < textureWidth * textureHeight ; ++i, ++inPixel32)
*outPixel16++ =
((((*inPixel32 >> 0) & 0xFF) >> 4) << 12) | // R
((((*inPixel32 >> 8) & 0xFF) >> 4) << 8) | // G
((((*inPixel32 >> 16) & 0xFF) >> 4) << 4) | // B
((((*inPixel32 >> 24) & 0xFF) >> 4) << 0); // A
free(textureData);
textureData = tempData;
// Ya no necesitamos el bitmap, lo liberamos
CGContextRelease(textureContext);
glGenTextures(1, &textures[0]);
glBindTexture(GL_TEXTURE_2D, textures[0]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, textureWidth, textureHeight, 0, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, textureData);
free(textureData);
//glEnable(GL_BLEND);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
}
答案 0 :(得分:3)
GL ES 1.1.12 specification (pdf)就此主题发表了这样的话:
GL将生成的纹理与其内部组件分辨率一起存储 自己选择。内部组件分辨率的分配可能会有所不同 在任何TexImage2D参数(目标除外)上,但分配不能是a 任何其他国家的功能,一旦建立就不能改变。
但是,根据iphone dev center,本机支持RGBA4444。所以我希望你的代码片段消耗2MB。你有理由怀疑它是否使用2MB?
答案 1 :(得分:1)
在OpenGL中,无法找出纹理使用多少视频内存。
此外,对这个问题没有单一答案。这些细节取决于显卡,驱动程序版本,平台..
答案 2 :(得分:1)
来自OpenGL ES Programming Guide for iOS:
如果您的申请无法使用 压缩纹理,考虑使用 较低精度的像素格式。一个 RGB565,RGBA5551或 RGBA4444格式使用一半的内存 RGBA8888格式的纹理。使用 RGBA8888仅适用于您的应用程序 需要那么高的质量。
在该段落之上,他们还建议使用PVRTC压缩纹理,因为它们可以节省更多内存。