Что-то не так с моим методом загрузки текстуры? - PullRequest
0 голосов
/ 26 января 2010

Я новичок в openGL и пытаюсь узнать как можно больше. Я использую этот метод для загрузки моих текстур openGL, загружая каждый .png как 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;
    }

    textureWidth = NextPowerOfTwo(CGImageGetWidth(textureImage));   
    textureHeight = NextPowerOfTwo(CGImageGetHeight(textureImage));

    imageSizeX= CGImageGetWidth(textureImage);
    imageSizeY= CGImageGetHeight(textureImage);

    GLubyte *textureData = (GLubyte *)calloc(1,textureWidth * textureHeight * 4); // Por 4 pues cada pixel necesita 4 bytes, RGBA

    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 "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;

    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);

    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);   
}

И это мой метод dealloc:

- (void)dealloc {
     glDeleteTextures(1,textures);
    [super dealloc];
}

Ответы [ 2 ]

0 голосов
/ 26 января 2010

Почему ты спрашиваешь? Разве это не выглядит прямо на экране?

Помимо порядкового порядка *outPixel16++ = blah; моей первой реакции
было удивительно, что iPhone поддерживает GL_UNSIGNED_SHORT_4_4_4_4.

Всякий раз, когда вы используете GL, убедитесь, что ваш контекст активен, используя
[EAGLContext setCurrentContext:context];

0 голосов
/ 26 января 2010

Я не совсем уверен насчет проблем, связанных с API, но, по крайней мере, кажется, что вы меняете порядок компонентов цвета при переупаковке (RGBA-> ABGR), и побитовое выражение может быть выражено лучше:

for(int i = 0; i < textureWidth * textureHeight; i++)
        outPixel16[i] = (inPixel32[i] >> 4  & 0xF) |
                        (inPixel32[i] >> 12 & 0xF) |
                        (inPixel32[i] >> 20 & 0xF) |
                        (inPixel32[i] >> 28 & 0xF);

Кстати, откуда взялся textures? Это глобально?

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