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 着色器本身会出现问题。