【发布时间】:2012-08-29 14:32:16
【问题描述】:
我正在加载 PNG 纹理,但在具有大量 Alpha 透明度的图像上出现了奇怪的伪影。
这里是源png: http://imgur.com/M8Wj3
这是游戏中白色背景的纹理: http://imgur.com/anliu
这是我用来加载图像的代码:
NSString* pTextureNameString = [NSString stringWithFormat:@"%s", fileNameWithPath];
UIImage* pImage = [UIImage imageNamed:pTextureNameString];
GLubyte* pImageData = (GLubyte*)malloc(pImage.size.width * pImage.size.height * 4);
CGContextRef imageContext = CGBitmapContextCreate(pImageData, pImage.size.width, pImage.size.height, 8, pImage.size.width * 4, CGColorSpaceCreateDeviceRGB(), kCGImageAlphaPremultipliedLast);
CGContextDrawImage(imageContext, CGRectMake(0.0, 0.0, pImage.size.width, pImage.size.height), pImage.CGImage);
CGContextRelease(imageContext);
// Build A Texture From The Data
glGenTextures(1, &m_textureID); // generate opengl texture id
glBindTexture(GL_TEXTURE_2D, m_textureID); // Bind Our Texture
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); // Linear Filtering
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); // Mipmap Linear Filtering
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, pImage.size.width, pImage.size.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, pImageData);
从 UIImage 中抓取 pImageData 的内存已经搞砸了,第一个像素是正确的红色,但下一个像素应该是透明的(如第三个像素)
red ok bad pixel ok bad pixel etc...
FF0000FF 05F04713 00000000 70EF7D15 302635B0 02000000 00000000
我在构建设置中关闭了 png 压缩,但没有任何影响。谁有想法? alpha/opengl 设置似乎是正确的,因为将此纹理更改为 TGA 或压缩为 PVRTC 会产生正确的图像。
【问题讨论】:
-
抱歉,没有意识到复选标记的意思是“接受”。 Stackoverflow 真的应该在那里添加一些文本......
标签: iphone opengl-es uiimage png alpha