2010-06-05 18 views
6

Cuando cargo texturas de imágenes normalmente, están boca abajo debido al sistema de coordenadas de OpenGL. ¿Cuál sería la mejor manera de darle la vuelta?Voltear la textura OpenGL

  • glScalef (1.0f, -1.0f, 1.0f);
  • cartografía de las coordenadas y de las texturas a la inversa
  • voltear verticalmente los archivos de imagen de forma manual (en Photoshop)
  • dándoles la vuelta programáticamente después de cargarlas (no sé cómo)

Esto es el método que estoy usando para cargar texturas png, en mi archivo Utilities.m (Objective-C):

+ (TextureImageRef)loadPngTexture:(NSString *)name { 
    CFURLRef textureURL = CFBundleCopyResourceURL(
                CFBundleGetMainBundle(), 
                (CFStringRef)name, 
                CFSTR("png"), 
                CFSTR("Textures")); 
    NSAssert(textureURL, @"Texture name invalid"); 

    CGImageSourceRef imageSource = CGImageSourceCreateWithURL(textureURL, NULL); 
    NSAssert(imageSource, @"Invalid Image Path."); 
    NSAssert((CGImageSourceGetCount(imageSource) > 0), @"No Image in Image Source."); 
    CFRelease(textureURL); 

    CGImageRef image = CGImageSourceCreateImageAtIndex(imageSource, 0, NULL); 
    NSAssert(image, @"Image not created."); 
    CFRelease(imageSource); 

    GLuint width = CGImageGetWidth(image); 
    GLuint height = CGImageGetHeight(image); 

    void *data = malloc(width * height * 4); 

    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
    NSAssert(colorSpace, @"Colorspace not created."); 

    CGContextRef context = CGBitmapContextCreate(
               data, 
               width, 
               height, 
               8, 
               width * 4, 
               colorSpace, 
               kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Host); 
    NSAssert(context, @"Context not created."); 

    CGColorSpaceRelease(colorSpace); 
    CGContextDrawImage(context, CGRectMake(0, 0, width, height), image); 
    CGImageRelease(image); 
    CGContextRelease(context); 

    return TextureImageCreate(width, height, data); 
} 

Dónde TextureImage es una estructura que tiene una altura, anchura y datos * vacíos.

Ahora mismo estoy jugando con OpenGL, pero luego quiero intentar hacer un simple juego de 2d. Estoy usando Cocoa para todas las ventanas y Objective-C como el idioma.

Además, otra cosa que me preguntaba: si hiciera un juego simple, con los píxeles asignados a las unidades, ¿estaría bien configurarlo para que el origen esté en la esquina superior izquierda (preferencia personal), o ¿me encontraría con problemas con otras cosas (por ejemplo, renderizado de texto)?

Gracias.

+1

Posible duplicado de http://stackoverflow.com/questions/506622/cgcontextdrawimage-draws-image-upside-down-when-passed-uiimage-cgimage –

+0

Tienes razón, y gracias, encontré una buena respuesta allí . – mk12

Respuesta

4

Cualquiera de los:

textura tirón durante la carga de la textura,
o modelo flip coordenadas de textura durante la carga modelo o conjunto de matriz de textura para voltear y (glMatrixMode (GL_TEXTURE)) durante render.

Además, otra cosa que me preguntaba: si hiciera un juego simple, con píxeles mapeados en unidades, ¿estaría bien configurarlo para que el origen esté en la esquina superior izquierda? (Preferencia personal), o me gustaría tener problemas con otras cosas (por ejemplo, la representación de texto)?

Depende de cómo se va a procesar el texto.

Cuestiones relacionadas