SMP*_*SMP 19 shader opengl-es ios opengl-es-2.0 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.5 VAO概述

XCode 4.4.1(iOS 5.1 SDK)
XCode 4.5(iOS 6 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;
....
}
Run Code Online (Sandbox Code Playgroud)
片段着色器
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;
....
}
Run Code Online (Sandbox Code Playgroud)
纹理加载
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];
Run Code Online (Sandbox Code Playgroud)
渲染循环(仅发送活动纹理的制服)
....
[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];
}
Run Code Online (Sandbox Code Playgroud)
自从iOS 6以来,有没有人有我的问题?
如前所述,您应该向 bugreport.apple.com 报告该错误。顺便说一句,如果您认为 GLKTextureLoader 可能是问题所在(似乎是一个很好的理论),那么您可能会通过我脑海中的两种方式之一缩小范围......
1)我会将显示的纹理渲染到一个简单的四边形,并查看渲染结果是否符合您的预期。即,它的渲染是否与您预期的垂直翻转?源纹理是否以某种您没有预料到的方式部分出现乱码?
2)您可以尝试将图像转换为不同的尺寸/颜色深度/图像类型,看看问题是否仍然存在。我的想法是,这似乎不太可能,但也许它没有被报告,因为由于图像格式的原因,您遇到了不寻常的边缘情况。了解这一点对于任何试图在苹果解决这个问题的人来说都会有巨大的帮助。
可能没有太大帮助,但无法访问您的所有资源和资产,很难知道该建议什么。FWIW,我有一些示例与您正在做的事情类似,但在 GLKit v. 10.8 下没有注意到任何事情。