【问题标题】:Loading a PNG file to openGL ES将 PNG 文件加载到 openGL ES
【发布时间】:2014-02-28 17:00:01
【问题描述】:

我正在尝试为openGL ES 上的对象设置某种纹理,这就是我加载它的方式:

- (GLuint)setupTexture:(NSString *)fileName {
    // 1
    CGImageRef spriteImage = [UIImage imageNamed:fileName].CGImage;
    if (!spriteImage) {
        NSLog(@"Failed to load image %@", fileName);
        exit(1);
    }

    size_t width = CGImageGetWidth(spriteImage);
    size_t height = CGImageGetHeight(spriteImage);


    GLubyte * spriteData = (GLubyte *) calloc(width*height*4, sizeof(GLubyte));


    CGContextRef spriteContext = CGBitmapContextCreate(spriteData, width, height, 8, width*4,
                                                       CGImageGetColorSpace(spriteImage), kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);

    CGContextDrawImage(spriteContext, CGRectMake(0, 0, width, height), spriteImage);

    CGContextRelease(spriteContext);
...
}

现在,当我使用这个tile_floor.png 文件时:

图像已加载并在屏幕上绘制。

但是当我使用这个wood.png 文件时:

我得到的只是一个黑色物体。

为什么不一样?文件尺寸(宽度或高度)是否重要?我没有“硬编码”任何尺寸或参数,以便可以加载所有图像。

重要的是要说我在控制台中没有收到任何错误,并且程序正在运行。

【问题讨论】:

    标签: ios iphone opengl-es png


    【解决方案1】:

    好的,我知道了。 openGL ES 需要 2 次方图像大小(宽度和高度)。 调整了照片的大小并且效果很好。

    【讨论】:

    • 这应该是评论而不是新答案。
    【解决方案2】:

    虽然您可以在许多 OpenGL ES 实现中使用 NPOT(非二的幂)图像(所有 iOS 设备都支持扩展 GL_APPLE_texture_2D_limited_npot),但您必须使用右边缘模式:

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    

    这将使纹理夹在纹理坐标 0、1 范围的边缘。你的木材纹理看起来不会重复。

    【讨论】:

    • 感谢 nikolai 的回答,我尝试将代码更改为您的报价,但我再次得到黑色物体。知道为什么吗?
    • @Itzik984 你是否使用了任何有趣的 mipmap 过滤器(除了最近的或线性的)?
    • 很抱歉,我不知道这对您来说失败的原因。它绝对适合我(和许多其他人)。
    • Nikolai,我将您提供的行添加到已使用的行中,如下所示:glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);它确实奏效了。非常感谢!
    • 好的,似乎是一个有趣的最小过滤器设置。
    猜你喜欢
    • 1970-01-01
    • 2014-01-03
    • 2011-02-09
    • 2014-02-19
    • 2017-08-27
    • 1970-01-01
    • 2011-10-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多