iPhoneФорумПрограммирование

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

#0
19:48, 2 апр 2012

Всем привет!

Есть проблемка с загрузкой 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];
#1
19:57, 2 апр 2012

Возможно DPI у картинки другой
Для айфона нужно 72 dpi

#2
0:07, 3 апр 2012

странно рисунок грузиться, есть же UIImage image=[UIImage initWithName:@"FileName.xxx"]; следует попробовать нарисовать непосредственно UIImage, а не текстуру.

#3
8:46, 3 апр 2012

Padawan
Покажи создание и заполнение текстуры.

#4
11:23, 3 апр 2012

Всем спасибо, но пока ещё не разобрался.

Артефакт всё-таки похож на проявление фильтрации, когда пиксели на экране не попадают 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
Скоро сделаю пример с кодом, если конечно не разберусь.

#5
11:44, 3 апр 2012

Padawan
> UIImage возможно сам умножает RGB на alpha
да

#6
12:11, 3 апр 2012

проблема в дробности координат в которых ты рисуешь. делай ceil/floor.

#7
15:38, 3 апр 2012

Короче, разобрался я.  Это мой баг, случайно установил фильтрацию в LINEAR, и этот стейт мне потом всё портил.

iPhoneФорумПрограммирование

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