翻转OpenGL纹理

时间:2010-06-05 18:10:31

标签: objective-c opengl image macos textures

当我正常加载图像中的纹理时,由于OpenGL的坐标系统,它们是颠倒的。翻转它们的最佳方法是什么?

  • glScalef(1.0f,-1.0f,1.0f);
  • 以反向方式映射纹理的y坐标
  • 手动垂直翻转图像文件(在Photoshop中)
  • 加载后以编程方式翻转它们(我不知道如何)

这是我用来加载png纹理的方法,在我的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);
}

其中TextureImage是具有height,width和void * data的结构。

现在我正在玩OpenGL,但后来我想尝试制作一个简单的2D游戏。我正在使用Cocoa进行所有窗口,使用Objective-C作为语言。

另外,我想知道另一件事:如果我做了一个简单的游戏,将像素映射到单位,是否可以设置它以使原点位于左上角(个人偏好),或者我会遇到其他问题(例如文字渲染)吗?

感谢。

2 个答案:

答案 0 :(得分:4)

其中任何一个:

在纹理加载期间翻转纹理,
或在模型加载期间翻转模型纹理坐标 或者在渲染过程中将纹理矩阵设置为翻转y(glMatrixMode(GL_TEXTURE))。

  

另外,我想知道另一件事:如果我做了一个简单的游戏,将像素映射到单位,是否可以设置它以使原点位于左上角(个人偏好),或者我会遇到其他问题(例如文字渲染)吗?

取决于您如何呈现文字。

答案 1 :(得分:0)

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

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

这项工作是否完美。