GLKTextureLoader意外地加载透明纹理

时间:2012-12-18 10:13:51

标签: textures glkit glktextureloader

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

1 个答案:

答案 0 :(得分:0)

问题在于EAGLContexts

GLKTextureLoader将字体加载到当前上下文([EAGLContext currentContext])并从那里正确显示它。在我的应用程序(它使用2个不同的上下文)中它有错误:有时我在一个上下文中加载并在另一个上下文中显示(在加载过程中忘记更改它们)。