从 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.5 VAO 概述
XCode 4.4.1 (iOS 5.1 SDK)
XCode 4.5 (iOS 6 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 以来,有没有人遇到过我的问题?