Я генерирую текст как изображение, используя 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.