自iOS 6起,GL纹理未正确映射

时间:2012-10-16 13:45:09

标签: ios opengl-es opengl-es-2.0 shader glkit

在我的3D对象上使用纹理时,我从Xcode 4.5和iOS 6 SDK获得了一个奇怪的行为。 在针对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帧捕获检查)并且纹理制服绑定正确。


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


代码/着色器代码段

上传和处理纹理的相关部分。我不得不将着色器剥离到minium。

顶点着色器

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 个答案:

答案 0 :(得分:1)

如上所述,您应该将错误报告给bugreport.apple.com。顺便说一句,如果你建议GLKTextureLoader可能是问题(似乎是一个很好的理论),那么你可以用两种方式中的一种方式缩小范围......

1)我会将显示的纹理呈现为一个普通的四边形,看看渲染结果是否符合您的预期。即,它是否垂直翻转你所期望的?源纹理是否以某种你没想到的方式部分出现乱码?

2)您可以尝试将图像转换为不同的尺寸/颜色深度/图像类型,并查看问题是否仍然存在。我在想的是,似乎不太可能,但也许它没有被报道,因为你因为图像格式的某些东西而遇到了一个不寻常的边缘情况。知道这对于任何试图解决这个问题的人都会有很大的帮助。

可能没什么帮助,但无法访问您的所有资源和资产,很难知道建议什么。 FWIW,我有一些样本与你正在做的事情类似,并且在GLKit v.10.8下没有注意到任何内容。