自iOS6以来,GLKTexture的映射不正确

19
自从使用Xcode 4.5和iOS 6 SDK在我的3D对象上使用纹理时,我遇到了奇怪的行为问题。在针对OS X 10.8 SDK构建时,我的Mac应用程序中也出现了这个问题。我在iOS上使用OpenGL ES 2.0,在OS X 10.8上使用OpenGL遗留配置文件(< 3.0)。纹理不再放置在正确的坐标处,而且有很多伪像。VAO已经被正确上传,并且没有纹理时看起来很好。当使用XCode 4.4.1和iOS 5.1 SDK时一切正常。VAO完全相同(通过OpenGL ES帧捕获进行了检查),纹理uniforms也绑定正确。

Xcode 4.4 VAO 概述

Xcode 4.4

Xcode 4.5 VAO概述

Xcode 4.5

XCode 4.4.1(iOS 5.1 SDK)

iOS Simulator 5.1 SDK

XCode 4.5(iOS 6 SDK)

iOS Simulator 6.0 SDK


代码/着色器片段

上传和处理纹理的相关部分。我不得不将着色器削减到最小。

顶点着色器

precision highp float;
attribute vec2 a_vTextureCoordinate;
uniform mat4 u_mModelViewMatrix;
uniform mat4 u_mModelViewMatrixInverse;
uniform mat4 u_mProjectionMatrix;
uniform mat4 u_mNormalMatrix;
void main()
{
....

    // Transform output position 
    gl_Position = u_mProjectionMatrix * u_mModelViewMatrix * a_vPosition;
    // Pass through texture coordinate v_texcoord = a_vTextureCoordinate.xy;
    v_vPosition = vec3(u_mModelViewMatrix * a_vPosition);
    v_vTextureCoordinate = a_vTextureCoordinate.xy;
    ....
}

片段着色器

precision highp float;
// location 1
uniform sampler2D u_diffuseTexture;
varying vec2 v_vTextureCoordinate;
varying vec3 v_vPosition;
....
void main() {
    ....
    vec4 base = texture2D(u_diffuseTexture, v_vTextureCoordinate);
    gl_FragColor = base;
    ....
}

纹理加载
    NSDictionary *options = @{GLKTextureLoaderOriginBottomLeft: @(YES), [NSNumber numberWithBool:YES] : GLKTextureLoaderGenerateMipmaps};
    NSError *error;
    path = [path stringByReplacingOccurrencesOfString:@"/" withString:@""];
    path = [[NSBundle mainBundle] pathForResource:[path stringByDeletingPathExtension] ofType:[path pathExtension]];
    GLKTextureInfo *texture = [GLKTextureLoader textureWithContentsOfFile:path options:options error:&error];

渲染循环(仅发送活动纹理的统一变量)
....
    [self setShaderTexture:[[materials objectForKey:@"diffuse"] objectForKey:@"glktexture"]
                    forKey:@"u_diffuseTexture"
             withUniform1i:0
            andTextureUnit:GL_TEXTURE0+0];
....

#pragma mark - Texture communication

-(void)setShaderTexture:(GLKTextureInfo*)texture forKey:(NSString*)key withUniform1i:(int32_t)uniform andTextureUnit:(int32_t)unit {
    glActiveTexture(unit);
    glBindTexture(texture.target, texture.name);
    [self.shaderManager sendUniform1Int:key parameter:uniform];
}

自从iOS 6以来,有没有人遇到过与我类似的问题?

1
你是否已经在https://bugreport.apple.com/上提交了错误报告?OpenGL ES工程师可能想要查看这个问题。你说这个问题也出现在你的10.8应用程序中。你在Mac端是否也使用了GLKTexture? - Brad Larson
1
嗨Brad,是的,我也在OS X 10.8下使用GLKit。我有点惊讶没有其他人报告过这个问题。在10.8的测试阶段中,我已经在苹果的测试论坛上询问过,但没有人知道。我也会提交一个错误报告。 - SMP
你能添加一些带有测试纹理的截图吗?例如,编号/彩色棋盘格。这样可以更好地观察偏移中的模式。 - Andreas
我会尽快添加一张截图。我会为此目的绘制一张。提前谢谢你。 - SMP
我不确定这是否与问题有关,但是您选项中的一个键/值对是反向的。应该是:NSDictionary *options = @{GLKTextureLoaderOriginBottomLeft: @(YES), GLKTextureLoaderGenerateMipmaps: [NSNumber numberWithBool:YES]} - David Cairns
1个回答

1

如前所述,您应该将错误报告给bugreport.apple.com。 另外,如果您认为GLKTextureLoader可能是问题所在(这似乎是一个很好的理论),则可以从以下两个方面之一缩小范围...

1)我会将纹理呈现为微不足道的四边形,并查看呈现结果是否符合您的预期,即它是否垂直翻转了您的预期? 源纹理是否以某种您不希望出现的方式部分损坏?

2)您可以尝试将图像转换为不同的大小/颜色深度/图像类型,并查看问题是否仍然存在。 我想的是,虽然这似乎不太可能,但也许没有被报告是因为您因图像格式的某些特殊情况而遇到了异常情况。 对于任何试图在苹果公司修复此问题的人来说,了解这一点将非常有帮助。

可能没有太大的帮助,但是如果没有访问所有源和资产,很难知道要建议什么。 顺便说一句,我有一些样本与您正在做的类似的事情,在GLKit v.10.8下没有注意到任何问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接