2010-06-05 140 views
6

當我通常從圖像加載紋理時,由於OpenGL的座標系統,它們是顛倒的。什麼是翻轉它們的最好方法?翻轉OpenGL紋理

  • glScalef(1.0f,-1.0f,1.0f);
  • 映射貼圖的y座標反向
  • 手動垂直翻轉的(在Photoshop)
  • 它們加載後翻轉他們編程的圖像文件(我不知道如何)

這是

+ (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); 
} 

哪裏TextureImage是具有高度,寬度和無效*數據一個結構:我使用加載PNG紋理,在我的Utilities.m文件的方法(目標-C)。

現在我只是玩OpenGL,但後來我想嘗試做一個簡單的2D遊戲。我將Cocoa用於所有窗口和Objective-C語言。另外,我想知道的另一件事情是:如果我製作了一個簡單的遊戲,將像素映射到單位,將它設置爲原點位於左上角(個人偏好),是否可以,或者我會遇到其他問題(例如文本渲染)的問題?

謝謝。

+1

可能的重複http://stackoverflow.com/questions/506622/cgcontextdrawimage-draws-image-upside-down-when-passed-uiimage-cgimage – 2010-06-05 20:54:13

+0

你是對的,謝謝,我在那裏找到了一個很好的答案。 – mk12 2010-06-05 21:52:33

回答

4

不限那些:模型負載 OR設置紋理矩陣期間紋理加載期間

翻轉質地,
或翻轉模型的紋理座標中呈現翻轉Y(glMatrixMode(GL_TEXTURE))。

另外,我想知道的另一件事是:如果我製作了一個簡單的遊戲,將像素映射到單位,將它設置爲原點位於左上角(個人偏好),還是我會遇到其他問題(例如文本渲染)的問題?

取決於您將如何呈現文本。