2

PNG テクスチャを読み込んでいますが、アルファ透明度が多い画像に奇妙なアーティファクトが発生します。

ソースの 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);

pImageData のメモリは、UIImage から取得した後に既にめちゃくちゃになっています。最初のピクセルは正しく赤ですが、次のピクセルは透明にする必要があります (3 番目のピクセルのように)。

red ok    bad pixel ok       bad pixel etc...
FF0000FF  05F04713  00000000 70EF7D15  302635B0 02000000 00000000

ビルド設定で png 圧縮をオフにしましたが、違いはありませんでした。誰にもアイデアはありますか?このテクスチャを TGA に変更するか、PVRTC に圧縮すると正しいイメージが得られるため、alpha/opengl 設定は正しいようです。

4

1 に答える 1

4

あはは、ここで答えを見つけました:透明な PNG からの openGL ES テクスチャは、奇妙なアーティファクトでレンダリングされており、私を夢中にさせています!

次の行を追加すると、問題が修正されます。

CGContextRef imageContext = CGBitmapContextCreate(pImageData, pImage.size.width, pImage.size.height, 8, pImage.size.width * 4, CGColorSpaceCreateDeviceRGB(), kCGImageAlphaPremultipliedLast);

// Set the correct blending copy mode!
CGContextSetBlendMode(imageContext, kCGBlendModeCopy);

CGContextDrawImage(imageContext, CGRectMake(0.0, 0.0, pImage.size.width, pImage.size.height), pImage.CGImage);
于 2012-09-04T22:13:03.300 に答える