将PNG文件加载到openGL ES

时间:2014-02-04 16:03:21

标签: ios iphone opengl-es png

我试图为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文件时:

enter image description here

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

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

enter image description here

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

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

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

2 个答案:

答案 0 :(得分:0)

好的,我知道了。 openGL ES需要2个图像大小(宽度和高度)的功率。 调整了照片的大小并且有效。

答案 1 :(得分:0)

虽然您可以在许多OpenGL ES实现中使用NPOT(非幂2)图像(所有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范围的边缘。无论如何,你的木质纹理看起来都不会重复。