我使用UIKit
(简化)生成文本作为图像:
UIGraphicsBeginImageContextWithOptions(textureSize, NO, 0);
[variant.text drawInRect:CGRectIntegral(necessaryRect) withFont:textFont lineBreakMode:UILineBreakModeWordWrap alignment:UITextAlignmentCenter];
UIImage *img = UIImagePNGRepresentation(UIGraphicsGetImageFromCurrentImageContext());
UIGraphicsEndImageContext();
然后我将其保存到缓存目录,并使用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%黑色)。
将底部纹理(2d0)的envMode
更改为GLKTextureEnvModeReplace
也会修复白色像素,但会移除光线。
我做错了什么?
更新
我最近写了自己的着色器。纹理没有问题,加载没有alpha预乘。所以,我预计GLKit着色器本身会出现问题。
答案 0 :(得分:0)
问题在于EAGLContexts
。
GLKTextureLoader
将字体加载到当前上下文([EAGLContext currentContext]
)并从那里正确显示它。在我的应用程序(它使用2个不同的上下文)中它有错误:有时我在一个上下文中加载并在另一个上下文中显示(在加载过程中忘记更改它们)。