Когда я загружаю текстуру как RGBA4444 в openGL, сколько памяти используется в устройстве? - PullRequest
4 голосов
/ 13 февраля 2010

Сколько памяти будет занимать текстура, загруженная этим методом?

При таком методе текстура 1024x1024 будет в любом случае потреблять 4 МБ? (независимо от загрузки как 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 ]

3 голосов
/ 13 февраля 2010

В спецификации GL ES 1.1.12 (pdf) есть что сказать по теме:

GL хранит полученную текстуру с внутренними компонентными разрешениями ее собственный выбор Распределение разрешения внутреннего компонента может варьироваться в зависимости от для любого параметра TexImage2D (кроме цели), но распределение не должно быть функция любого другого состояния и не может быть изменена после установления.

Однако, согласно iphone dev center , RGBA4444 изначально поддерживается. Поэтому я ожидаю, что он будет занимать 2 МБ с вашим фрагментом кода. У вас есть основания сомневаться, что он использует 2 МБ?

1 голос
/ 09 апреля 2011

Из OpenGL ES Руководство по программированию для iOS :

Если ваше приложение не может использовать сжатые текстуры, рассмотрите возможность использования пиксельный формат с меньшей точностью. текстуры в RGB565, RGBA5551 или Формат RGBA4444 использует половину памяти текстуры в формате RGBA8888. использование RGBA8888 только когда ваше приложение нужен такой уровень качества.

Над этим абзацем они также действительно рекомендуют использовать сжатые текстуры PVRTC, поскольку они экономят еще больше памяти.

1 голос
/ 13 февраля 2010

В OpenGL нет способа узнать, сколько видеопамяти использует текстура.

Также нет однозначного ответа на вопрос, с которого можно начать. Такие детали зависят от графической карты, версии драйвера, платформы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...