Iphone openGL ES来自PNG的透明纹理被渲染成奇怪的工件,让我抓狂!

Iphone openGL ES来自PNG的透明纹理被渲染成奇怪的工件,让我抓狂!,iphone,opengl-es,quartz-graphics,textures,Iphone,Opengl Es,Quartz Graphics,Textures,我开始开发我的第一个OpenGL iPhone应用程序,但我遇到了一个早期的障碍 我有一个非常简单的小纹理,我想用它作为2D游戏中的精灵,但它在顶部用奇怪的“随机”彩色像素进行渲染 我从代码中看到的一个问题是,在绘制图像之前没有清除上下文。由于您的图像包含透明区域,并且是在背景上合成的,因此您只需查看malloc分配的内存中的内容。在绘制图像之前,请尝试将石英混合模式设置为复制: CGContextSetBlendMode(textureContext, kCGBlendModeCopy);

我开始开发我的第一个OpenGL iPhone应用程序,但我遇到了一个早期的障碍

我有一个非常简单的小纹理,我想用它作为2D游戏中的精灵,但它在顶部用奇怪的“随机”彩色像素进行渲染


我从代码中看到的一个问题是,在绘制图像之前没有清除上下文。由于您的图像包含透明区域,并且是在背景上合成的,因此您只需查看malloc分配的内存中的内容。在绘制图像之前,请尝试将石英混合模式设置为复制:

CGContextSetBlendMode(textureContext, kCGBlendModeCopy);
您还可以使用calloc而不是malloc,因为calloc提供了零内存

您的OpenGL混合是正确的:

glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);

给你波特·达夫“结束”,这是你通常想要的。

先尝试删除你的CGContextRef:

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

很可能您的图像有一些alpha值为零的彩色像素,但由于混合功能,您正在显示它们。试一试

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

你真棒!这个答案让我很开心,对我来说很有意义!我有一种感觉,那些文物是某种遗留下来的记忆,但我没有仔细考虑。再次非常感谢!你太牛了变红了。。。很高兴我能帮忙。也谢谢!我不明白为什么我有这么多的人工制品,现在看起来很棒。这个混合函数只对非预乘alpha有很好的效果,这在石英中很少出现。
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);