Всем привет!
Есть проблемка с загрузкой png-текстур:
Справа всё выглядит смазанным, с нечёткими краями. Как думаете, в чём может быть дело? Я не сильно долго разбирался. Но думаю что это не фильтрация, об этом я позаботился.
Загрузка сделана таким образом:
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];
Возможно DPI у картинки другой
Для айфона нужно 72 dpi
странно рисунок грузиться, есть же UIImage image=[UIImage initWithName:@"FileName.xxx"]; следует попробовать нарисовать непосредственно UIImage, а не текстуру.
Padawan
Покажи создание и заполнение текстуры.
Всем спасибо, но пока ещё не разобрался.
Артефакт всё-таки похож на проявление фильтрации, когда пиксели на экране не попадают 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
Скоро сделаю пример с кодом, если конечно не разберусь.
Padawan
> UIImage возможно сам умножает RGB на alpha
да
проблема в дробности координат в которых ты рисуешь. делай ceil/floor.
Короче, разобрался я. Это мой баг, случайно установил фильтрацию в LINEAR, и этот стейт мне потом всё портил.
Тема в архиве.