Pregunta

Estoy programando una pequeña aplicación con OpenGL para iPhone, y ahora quiero cargar texturas en formato PVRTC. ¿Esto es complicado? En este momento, todas mis texturas están en formato .png, y estoy usando este método para cargarlas:

- (void)loadTexture:(NSString*)nombre {

    CGImageRef textureImage = [UIImage imageNamed:nombre].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); 

    CGContextRef textureContext = CGBitmapContextCreate(textureData, textureWidth,textureHeight,8, textureWidth * 4,CGImageGetColorSpace(textureImage),kCGImageAlphaPremultipliedLast );
    CGContextDrawImage(textureContext, CGRectMake(0.0, 0.0, (float)textureWidth, (float)textureHeight), textureImage);

    CGContextRelease(textureContext);
    a
    glGenTextures(1, &textures[0]);

    glBindTexture(GL_TEXTURE_2D, textures[0]);


    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, textureWidth, textureHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, 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);   

}

¿La modificación de esta función para leer PVRTC es complicada? ¿Cómo puedo hacerlo?

¿Fue útil?

Solución

Sí, querrás mirar la muestra de PVRTextureLoader. Es un formato de archivo muy simple. La pieza clave es la estructura del encabezado:

typedef struct _PVRTexHeader
{
    uint32_t headerLength;
    uint32_t height;
    uint32_t width;
    uint32_t numMipmaps;
    uint32_t flags;
    uint32_t dataLength;
    uint32_t bpp;
    uint32_t bitmaskRed;
    uint32_t bitmaskGreen;
    uint32_t bitmaskBlue;
    uint32_t bitmaskAlpha;
    uint32_t pvrTag;
    uint32_t numSurfs;
} PVRTexHeader;

Luego puedes absorber todo el archivo con dataWithContentsOfFile , y simplemente enviar el resultado a la estructura:

NSString* resourcePath = [[NSBundle mainBundle] resourcePath];
NSString* fullPath = [resourcePath stringByAppendingPathComponent:nombre];
NSData* fileData = [NSData dataWithContentsOfFile:fullPath];
PVRTexHeader* header = (PVRTexHeader*) [fileData bytes];
char* imageData = (char*) [fileData bytes] + header->headerLength;

Para determinar el formato de textura, puedes mirar el campo banderas en la estructura. No olvides llamar a glCompressedTexImage2D en lugar de glTexImage2D .

Otros consejos

Vea el ejemplo de PVRTextureLoader en la documentación del desarrollador en XCode. Tiene todo lo que necesitas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top