透明性のPNG画像からOpenGL ESのテクスチャは奇妙なアーティファクトと私にナットを駆動してレンダリングされています!
-
22-08-2019 - |
質問
私は私の最初のOpenGLのiPhoneアプリ上で動作するように始めていますが、私は早く暗礁に乗り上げるてきます。
私は2Dのゲームでスプライトとして使用する非常にシンプルな少し質感を持っているが、それはトップアップ奇妙な「ランダム」色のピクセルでレンダリングします。
http://i40.tinypic.com/2s7c9ro.png の< - ここではスクリーンショット
私は一種の、これは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));
おそらく、あなたのイメージはゼロアルファ値を持ついくつかの着色画素がありますが、理由ブレンディング機能により、あなたはそれらを示しています。試してみてください。
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
所属していません StackOverflow