2012-08-16 52 views
0

我正在使用RayWenderlich OpenGL教程,发现here作为应用程序的起点。 虽然加入我自己的纹理,但我遇到了一些困难。无论我添加到该项目中的任何图像都会呈现黑色。我已经尝试了不同的png(用于示例)和JPEG的设置。我试过只是改变默认加载和绘制的文件名,并创建一个不同的纹理实例,并且都是黑色的。OpenGL:只有一些纹理可以工作

我试过在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

我经常遇到困难让OpenGL设置恰到好处。听起来就是这个问题。你为什么不向我们展示一些相关的代码,我们可能会提供帮助? – jakev 2012-08-17 00:49:59

+0

真的没有太多相关的代码,只是样本中的内容。它带有一个方法,您可以放入文件名,并返回与纹理关联的GLuint。我只是将输入字符串更改为我的纹理。我将把代码放在问题中。 – Bananable 2012-08-17 04:33:50

回答

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); 
0

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

+0

随意接受你自己的答案(当然,只有当它是你的问题的正确解决方案时)。 – 2012-08-17 07:35:27