Ayuda a cargar texturas en formato PVRTC para el iPhone.
-
05-07-2019 - |
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?
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.