Листать текстуру OpenGL - PullRequest
       6

Листать текстуру OpenGL

7 голосов
/ 05 июня 2010

Когда я загружаю текстуры из изображений нормально, они переворачиваются из-за системы координат OpenGL. Как лучше всего перевернуть их?

  • glScalef (1,0f, -1,0f, 1,0f);
  • отображение координат Y текстур в обратном порядке
  • вертикальное перелистывание файлов изображений вручную (в фотошопе)
  • переворачивать их программно после загрузки (не знаю как)

Это метод, который я использую для загрузки 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 - это структура, имеющая данные о высоте, ширине и пустоте *.

Сейчас я просто играю с OpenGL, но позже я хочу попробовать сделать простую 2d игру. Я использую Какао для всех окон и Objective-C в качестве языка.

Кроме того, еще одна вещь, которая меня интересует: если бы я сделал простую игру с пикселями, сопоставленными с единицами измерения, было бы хорошо настроить ее так, чтобы источник находился в верхнем левом углу (личные предпочтения), или я столкнулся бы с проблемами с другими вещами (например, рендеринг текста)?

Спасибо.

Ответы [ 2 ]

4 голосов
/ 06 июня 2010

Любой из них:

Отразить текстуру во время загрузки текстуры,
ИЛИ перевернуть координаты текстуры модели во время загрузки модели ИЛИ установите текстурную матрицу на flip y (glMatrixMode (GL_TEXTURE)) во время рендеринга.

Кроме того, еще одна вещь, которая меня интересует: если бы я сделал простую игру с пикселями, сопоставленными с единицами, было бы хорошо настроить ее так, чтобы источник находился в верхнем левом углу (личные предпочтения), или я столкнулся бы с проблемами с другими вещами (например, рендеринг текста)?

Зависит от того, как вы собираетесь отображать текст.

0 голосов
/ 06 июня 2010

Джордан Льюис указал CGContextDrawImage рисует изображение вверх ногами при прохождении UIImage.CGImage . Там я нашел быстрое и простое решение: перед вызовом CGContextDrawImage,

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

Отлично справляется с работой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...