我开始在我的第一个OpenGL的iPhone应用程序的工作,但我已经打了一个早期的障碍。

我有一个非常简单的小的质感,我想作为一个2D游戏精灵使用,但它怪异的“随机”彩色像素往上顶渲染。

http://i40.tinypic.com/2s7c9ro.png < - 屏幕截图这里

我有点得到的感觉,这是Photoshop的过错,所以如果任何人一些事请让我知道。

如果它不是那么的Photoshop它得是我的代码......所以在这里是有问题的代码...

- (void)loadTexture {

CGImageRef textureImage = [UIImage imageNamed:@"zombie0.png"].CGImage;

if (textureImage == nil) {
    NSLog(@"Failed to load texture image");
    return;
}

NSInteger texWidth = CGImageGetWidth(textureImage);
NSInteger texHeight = CGImageGetHeight(textureImage);

GLubyte *textureData = (GLubyte *)malloc(texWidth * texHeight * 4);

CGContextRef textureContext = CGBitmapContextCreate(textureData, texWidth, texHeight, 8, texWidth * 4, CGImageGetColorSpace(textureImage), kCGImageAlphaPremultipliedLast);

CGContextDrawImage(textureContext, CGRectMake(0.0, 0.0, (float)texWidth, (float)texHeight), textureImage);

CGContextRelease(textureContext);

glGenTextures(1, &textures[0]);

glBindTexture(GL_TEXTURE_2D, textures[0]);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texWidth, texHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, textureData);

free(textureData);

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

glEnable(GL_TEXTURE_2D);

glEnable(GL_BLEND);
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);

}

此混合函数,得到最好的结果。

请让我知道你的想法是错误的。

非常感谢你,这个问题已经让我疯了。

有帮助吗?

解决方案

一个问题,我可以从代码中看到的是,你不绘制图像之前清除您的上下文。由于图像中包含透明区域,由在后台,你只要看看有什么通过的malloc分配的内存。尝试设置你绘制图像之前石英的混合模式复制:

CGContextSetBlendMode(textureContext, kCGBlendModeCopy);

您也可以使用释放calloc代替malloc的,因为释放calloc给你清零的内存。

您的OpenGL混合是正确的:

glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);

给你波特 - 达夫“OVER”,这是你平时想什么。

其他提示

尝试删除您CGContextRef第一:

CGContextSetRGBFillColor(ctxt, 1, 1, 1, 0);
CGContextFillRect(ctxt, CGRectMake(0, 0, w, h));

最有可能你的形象有一个零alpha值一些彩色的像素,但由于混合功能的你向他们展示。尝试

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top