0

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% 黑色)。

envMode将底部纹理 (2d0)更改为GLKTextureEnvModeReplace也将修复白色像素,但会移除光线。

我究竟做错了什么?

更新:

我最近编写了自己的着色器。纹理没有问题,加载时没有 alpha 预乘。所以,我预计 GLKit 着色器本身会出现问题。

4

1 回答 1

0

The problem was in different EAGLContexts.

GLKTextureLoader loads fonts to current context ([EAGLContext currentContext]) and correctly displays it from there. And in my app (it uses 2 different contexts) it was buggy: sometimes I loaded in one context and displayed in another (simply forgot to change them during loading).

于 2013-02-12T03:24:24.483 回答