GLKTextureLoader неожиданно загружает прозрачные текстуры

Я генерирую текст как изображение, используя UIKit (Упрощенный):

UIGraphicsBeginImageContextWithOptions(textureSize, NO, 0);
    [variant.text drawInRect:CGRectIntegral(necessaryRect) withFont:textFont lineBreakMode:UILineBreakModeWordWrap alignment:UITextAlignmentCenter];
    UIImage *img = UIImagePNGRepresentation(UIGraphicsGetImageFromCurrentImageContext());
UIGraphicsEndImageContext();

Затем я сохраняю его в директорию caches и загружаю из файла GLKTextureLoader (-textureWithContentsOfFile:options:error:; options = nil).

После загрузки я вижу "белые артефакты" - белые пиксели вокруг текста, особенно хорошо видимые, когда свет не прямой (применяя некоторый поворот к текстурированной поверхности).

Я проверил сгенерированные изображения - открыл их в редакторе изображений и добавил черный фон - я не вижу там ничего, кроме черного цвета. Затем я проверил текстуры - добавил еще одну текстуру позади текста - просто залил черным цветом. И на моем 3D-объекте я вижу "белые тени" вокруг текстовых букв, как некоторые границы.

effect.textrue2d0.envMode = GLKTextureEnvModeDecal;    // just text
...
effect.texture2d0.envMode = GLKTextureEnvModeModulate; // black bg gexture + text
effect.textrue2d1.envMode = GLKTextureEnvModeDecal;
...
glEnable(GL_BLEND);  // always
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);

Если я загружаю текстуру с GLKTextureLoaderApplyPremultiplication включен, проблема исправлена, но текст выглядит не очень ясно (например, не используется черный цвет на 100%).

изменения envMode нижней текстуры (2d0) до GLKTextureEnvModeReplace также исправит белые пиксели, но удалит свет.

Что я делаю неправильно?

Обновить:

Я недавно написал свои собственные шейдеры. И нет проблем с текстурами, загруженными без предварительного умножения альфа. Итак, я ожидаю проблемы с самим шейдером GLKit.

1 ответ

Решение

Проблема была в другом EAGLContexts,

GLKTextureLoader загружает шрифты в текущий контекст ([EAGLContext currentContext]) и правильно отображает его оттуда. И в моем приложении (оно использует 2 разных контекста) было глючно: иногда я загружал в одном контексте и отображал в другом (просто забыл изменить их во время загрузки).

Другие вопросы по тегам