在我的应用程序(Tres)中,我正在从图像选取器加载图像并将其放在纹理上。这一切在我的所有测试中都运行良好,但是现在,那些带有视网膜显示器的iPad的在线人士抱怨图像变黑了。
我正在查看GL_MAX_TEXTURE_SIZE以确保图片不大于此。
我在这里设置纹理:
texture_aspect = image.size.width / image.size.height;
CGFloat side = image.size.width;
if(side>GL_MAX_TEXTURE_SIZE)
side = GL_MAX_TEXTURE_SIZE;
UIImage *newImage = [ImageUtils imageWithImage:image scaledToSize:CGSizeMake(side, side)];
image_height = 600.0f;
image_width = image_height * texture_aspect;
if(image_width>600.0f) {
image_width = 900.0f;
image_height = image_width / texture_aspect;
}
NSError* error;
GLKTextureInfo * texture = [GLKTextureLoader textureWithCGImage:newImage.CGImage options:nil error:&error];
if (error) {
NSLog(@"Error loading texture from image: %@",error);
}
这就是我绘制图像的方式:
- (void) dibujaFoto {
self.effect.texture2d0.enabled = GL_TRUE;
[self.effect prepareToDraw];
glEnableVertexAttribArray(GLKVertexAttribPosition);
glEnableVertexAttribArray(GLKVertexAttribTexCoord0);
GLfloat squareVertices[] = {
-image_width/2, -image_height/2,
image_width/2,-image_height/2,
-image_width/2, image_height/2,
image_width/2,image_height/2,
};
const GLfloat squareTextureCoords[] = {
0.0, 1.0,
1.0, 1.0,
0.0, 0.0,
1.0, 0.0,
};
glVertexAttribPointer(GLKVertexAttribPosition, 2, GL_FLOAT, GL_FALSE, 0, squareVertices);
glVertexAttribPointer(GLKVertexAttribTexCoord0, 2, GL_FLOAT, GL_FALSE, 0, squareTextureCoords);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
glDisableVertexAttribArray(GLKVertexAttribPosition);
glDisableVertexAttribArray(GLKVertexAttribTexCoord0);
self.effect.texture2d0.enabled = GL_FALSE;
}
图像有多大并不重要,它总是适用于我的第二代iPad,但看起来视网膜显示器的代码存在问题。
答案 0 :(得分:5)
首先,您实际上并未阅读最大纹理大小。 GL_MAX_TEXTURE_SIZE不代表设备上的最大纹理大小,它是在读取最大纹理大小时使用的OpenGL ES常量。
要读取实际的最大纹理大小,您需要使用以下内容:
static GLint maxTextureSize = 0;
glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxTextureSize);
当然,您需要在设置完EAGLContext后运行此功能。
较旧的设备(iPhone 4S之前版本)的最大纹理尺寸均为2048x2048。 A5及以上设备(4S及更新版本)的纹理尺寸最大为4096x4096。
此处出现其他问题,因为我的SDK上的GL_MAX_TEXTURE_SIZE常量转换为3379(十进制),这应该在Retina iPad上的4096x4096最大纹理尺寸范围内(但对于原始型号的iPad而言太大) 。我不明白为什么这会在那些而不是旧设备上失败。您的ImageUtils类是否可能以不正确的方式应用设备比例因子?