从透明的PNG OpenGL ES的纹理渲染怪异的文物和我发疯!
-
22-08-2019 - |
题
我开始在我的第一个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);
不隶属于 StackOverflow