2009-08-17 43 views
2

我正在写一个2D的游戏在Iphone,它使用纹理作为精灵,我得到有些图像我呈现彩色噪音(但这样的噪音永远不会出现纹理本身,只在它周围的透明部分)。这个问题不会发生在我的其他纹理上。这是我用来加载纹理的代码:加载一些纹理与iPhone的openGL时奇怪的颜色

- (void)loadTexture:(NSString*)nombre { 

CGImageRef textureImage = [UIImage imageNamed:nombre].CGImage; 
if (textureImage == nil) { 
NSLog(@"Failed to load texture image"); 
return; 
} 

textureWidth = NextPowerOfTwo(CGImageGetWidth(textureImage)); 
textureHeight = NextPowerOfTwo(CGImageGetHeight(textureImage)); 

imageSizeX= CGImageGetWidth(textureImage); 
imageSizeY= CGImageGetHeight(textureImage); 

GLubyte *textureData = (GLubyte *)malloc(textureWidth * textureHeight * 4); 

CGContextRef textureContext = CGBitmapContextCreate(textureData, textureWidth,textureHeight,8, textureWidth * 4,CGImageGetColorSpace(textureImage),kCGImageAlphaPremultipliedLast); 
CGContextDrawImage(textureContext, CGRectMake(0.0, 0.0, (float)textureWidth, (float)textureHeight), textureImage); 

CGContextRelease(textureContext); 

glGenTextures(1, &textures[0]); 

glBindTexture(GL_TEXTURE_2D, textures[0]); 

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, textureWidth, textureHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, textureData); 

free(textureData); 

glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); 

glEnable(GL_BLEND); 

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 

} 
+0

你能提供截图吗? – 2009-08-17 16:36:30

回答

4

在绘制图像之前,您的内存不会被清零。您看到的有趣像素是图像透明区域中的旧数据。使用calloc而不是malloccalloc返回归零内存)。

在绘制图像之前,您还可以使用CGContextSetBlendMode(textureContext, kCGBlendModeCopy);

如果你想知道原委:

这个问题对于小图像只存在由于确定malloc有小分配大小不同的代码路径的事实。它从它在用户空间管理的池中返回一个小块。如果请求的大小大于某个阈值(16K,我相信),malloc从内核获取内存。新页面当然归零了。

我花了一段时间才弄清楚。

+0

问题解决了,感谢您的帮助。 – 2009-08-18 12:56:58