0

我正在使用此处找到的 RayWenderlich OpenGL 教程作为应用程序的起点。不过,在添加我自己的纹理后,我遇到了一些困难。无论我添加到项目中的任何图像都会变黑。我尝试了 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;

}
4

2 回答 2

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);
于 2012-09-11T20:02:43.313 回答
0

我发现我的问题是我的图像尺寸不是 2 的幂(2、4、8、16、32、64、128、256、512、1024)。显然 OpenGL ES 需要这个。

于 2012-08-17T06:46:08.137 回答