3

在我的应用程序(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 上运行,但似乎视网膜显示器与此代码存在问题。

4

1 回答 1

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 类是否可能以不正确的方式应用设备比例因子?

于 2013-05-28T14:30:45.000 回答