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 разных контекста) было глючно: иногда я загружал в одном контексте и отображал в другом (просто забыл изменить их во время загрузки).