我试图为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
文件时:
我得到的只是一个黑色物体。
为什么会有所不同?文件尺寸(宽度或高度)是否有任何重要性?我没有“硬编码”任何尺寸或参数,因此可以加载所有图像。
重要的是要说我在控制台中没有出现任何错误,程序正在运行。
答案 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范围的边缘。无论如何,你的木质纹理看起来都不会重复。