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.


person kpower    schedule 18.12.2012    source источник


Ответы (1)


Проблема была в разных EAGLContexts.

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

person kpower    schedule 12.02.2013