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 帧捕获检查),并且纹理制服也正确绑定。


Xcode 4.4 VAO 概述

Xcode 4.4

Xcode 4.5 VAO 概述

Xcode 4.5

XCode 4.4.1 (iOS 5.1 SDK)

iOS 模拟器 5.1 SDK

XCode 4.5 (iOS 6 SDK)

iOS 模拟器 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 以来,有没有人遇到过我的问题?

4

1 回答 1

1

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

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

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

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

于 2012-10-19T21:51:45.067 回答