当我在openGL中加载纹理为RGBA4444时,设备中消耗了多少内存?

时间:2010-02-12 23:59:38

标签: iphone opengl-es textures

使用此方法加载纹理会消耗多少内存?

使用这种方法,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);   

}

3 个答案:

答案 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压缩纹理,因为它们可以节省更多内存。