我正在使用RayWenderlich OpenGL教程here作为应用的起点。 在添加我自己的纹理后,我遇到了一些困难。无论我添加到项目中的任何图像都会变黑。我尝试了不同的png(在样本中使用)和JPEG的设置。我已经尝试过更改默认加载和绘制的文件名,并创建一个不同的纹理实例,两者都是黑色。
我尝试在Photoshop中打开地板纹理并重新保存它,它在游戏中看起来不可见。
但我尝试使用不同的名称复制项目原始的tile_floor.png文件,该文件工作正常,所以我假设opengl需要非常特定的格式。
我需要做些什么才能让它发挥作用?
编辑:
这是用于加载图像的方法:
static GLuint setupTexture(NSString *fileName) {
// 1
CGImageRef spriteImage = [UIImage imageNamed:fileName].CGImage;
if (!spriteImage) {
NSLog(@"Failed to load image %@", fileName);
exit(1);
}
// 2
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);
// 3
CGContextDrawImage(spriteContext, CGRectMake(0, 0, width, height), spriteImage);
CGContextRelease(spriteContext);
// 4
GLuint texName;
glGenTextures(1, &texName);
glBindTexture(GL_TEXTURE_2D, texName);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, spriteData);
free(spriteData);
return texName;
}
答案 0 :(得分:4)
对于非二次幂纹理,您需要在glTexImage2D之前为纹理设置参数GL_CLAMP_TO_EDGE。
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);