iPhone: Создание игр для iOS (iPhone и iPad)
GameDev.ru / Сообщества / iPhone / Форум / Загрузка текстур из PNG с прозрачностью, через UIImage

Загрузка текстур из PNG с прозрачностью, через UIImage

PadawanПостоялецwww2 апр. 201219:48#0
Всем привет!

Есть проблемка с загрузкой png-текстур:

premultiplied | Загрузка текстур из PNG с прозрачностью, через UIImage

Справа всё выглядит смазанным, с нечёткими краями. Как думаете, в чём может быть дело?  Я не сильно долго разбирался. Но думаю что это не фильтрация, об этом я позаботился.

Загрузка сделана таким образом:

  NSString *filePath = [[NSBundle mainBundle] pathForResource:rpath ofType:((typeFlag == TEXTURE_TYPEFLAG_JPG)? @"jpg" : @"png")];
  NSData *texData = [[NSData alloc] initWithContentsOfFile:filePath];
  UIImage *image = [[UIImage alloc] initWithData:texData];
...

        context = CGBitmapContextCreate(data, width, height, 8, 4*width, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);

Пробовал менять kCGImageAlphaPremultipliedLast  на kCGImageAlphaLast, но в результате всё сильно портится. Видимо, UIImage/initWithData уже делает коррекцию RGB-компонент, и никак его от этого не отучить.

Рисовать пробовал как с glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA), так и через glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA) -- всё одно и то же.  Объекты - это прямоугольные спрайты в параллельной проекции.

Рендербуфер сделан с флагом kEAGLColorFormatRGBA8:

    eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys:
                    [NSNumber numberWithBool:FALSE], kEAGLDrawablePropertyRetainedBacking, kEAGLColorFormatRGBA8, kEAGLDrawablePropertyColorFormat, nil];

Sergio10Постоялецwww2 апр. 201219:57#1
Возможно DPI у картинки другой
Для айфона нужно 72 dpi
TorpedO.vrnПостоялецwww3 апр. 20120:07#2
странно рисунок грузиться, есть же UIImage image=[UIImage initWithName:@"FileName.xxx"]; следует попробовать нарисовать непосредственно UIImage, а не текстуру.
0r@ngEУчастникwww3 апр. 20128:46#3
Padawan
Покажи создание и заполнение текстуры.
PadawanПостоялецwww3 апр. 201211:23#4
Всем спасибо, но пока ещё не разобрался.

Артефакт всё-таки похож на проявление фильтрации, когда пиксели на экране не попадают 1-в-1 на пиксели из текстуры после всех преобразований.

Почему это происходит, для меня остаётся загадкой. Для вычисления UV координат пользуюсь формулой ( i/N + (i+1)/N ) / 2  == ( 2i + 1 ) / 2N, где i - номер пикселя, N - размер текстуры. Координаты вершин всегда целые. Размеры - тоже целые. Преобразования - только projection и один translate.

Sergio10
В моем случае было 72 dpi.

TorpedO.vrn
Это сделано чтобы не было автоматической неудачной попытки загрузки увеличенной копии текстуры, и последующего масштабирования под retina. Чуть позднее проверю это предположение, а также я думаю что UIImage возможно сам умножает RGB на alpha.

0r@ngE
Скоро сделаю пример с кодом, если конечно не разберусь.

SergioУдалёнwww3 апр. 201211:44#5
Padawan
> UIImage возможно сам умножает RGB на alpha
да
ALTAIRПостоялецwww3 апр. 201212:11#6
проблема в дробности координат в которых ты рисуешь. делай ceil/floor.
PadawanПостоялецwww3 апр. 201215:38#7
Короче, разобрался я.  Это мой баг, случайно установил фильтрацию в LINEAR, и этот стейт мне потом всё портил.

/ Форум / iPhone: Создание игр / Программирование

Тема в архиве.

2001—2018 © GameDev.ru — Разработка игр