代码之家  ›  专栏  ›  技术社区  ›  mk12

翻转OpenGL纹理

  •  6
  • mk12  · 技术社区  · 14 年前

    当我通常从图像加载纹理时,它们是颠倒的,因为OpenGL的坐标系。最好的翻转方式是什么?

    • glscalef(1.0f,-1.0f,1.0f);
    • 反向映射纹理的Y坐标
    • 手动垂直翻转图像文件(在Photoshop中)
    • 加载后按程序翻转它们(我不知道如何操作)

    这是我在utilities.m文件(objective-c)中用于加载PNG纹理的方法:

    + (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是一个具有高度、宽度和void*数据的结构。

    现在我只是在玩OpenGL,但后来我想尝试制作一个简单的二维游戏。我在使用cocoa作为所有窗口和objective-c语言。

    另外,我想知道的另一件事是:如果我制作了一个简单的游戏,将像素映射到单位,那么设置它使原点位于左上角(个人偏好),还是会遇到其他问题(例如文本呈现)?

    谢谢。

    2 回复  |  直到 14 年前
        1
  •  4
  •   SigTerm    14 年前

    其中任何一个:

    在纹理加载期间翻转纹理,
    或在模型加载期间翻转模型纹理坐标 或在渲染期间将“纹理矩阵”(Texture Matrix)设置为“翻转Y”(GlMatrixMode(Gl_纹理))。

    另外,我想知道的另一件事是:如果我制作了一个简单的游戏,将像素映射到单位,那么设置它使原点位于左上角(个人偏好),还是会遇到其他问题(例如文本呈现)?

    取决于如何渲染文本。

        2
  •  0
  •   Community dbr    7 年前

    乔丹·刘易斯指出 CGContextDrawImage draws image upside down when passed UIImage.CGImage . 在那里,我找到了一个简单快捷的解决方案:在调用cContextDrawImage之前,

    CGContextTranslateCTM(context, 0, height);
    CGContextScaleCTM(context, 1.0f, -1.0f);
    

    工作做得很好。