2009-07-03 5 views
12

私は最初のOpenGL iPhoneアプリで作業を始めていますが、早い段階で打ちました。透明なPNGのOpenGL ESテクスチャが奇妙なアーティファクトでレンダリングされていて、ナットを運転しています!

私は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); 

}

このブレンド機能もお奨めですその後、フォトショップれていない場合には、最良の結果が得られました。

あなたが間違っていると思われることを教えてください。

ありがとう、この問題は私をナットにしてくれました。

答えて

19

コードからわかる1つの問題は、イメージを描画する前にコンテキストをクリアしていないことです。イメージには透明な領域が含まれており、バックグラウンドで構成されているので、mallocによって割り当てられたメモリの内容を見るだけです。画像を描画する前にコピーするためにあなたのクォーツブレンドモードを設定してみてください:

CGContextSetBlendMode(textureContext, kCGBlendModeCopy); 

のcallocあなたがメモリをゼロにできますので、あなたはまた、malloc関数の代わりにはcallocを使用することができます。

あなたのOpenGLのブレンドが正しい:

glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); 

はあなたが通常望むものである、 "OVER" あなたのポーター・ダフを与えます。

+0

あなたは素晴らしいです! この回答は私を完全に幸せにし、私には意味をなさない! 私は、それらの人工物が何らかの記憶に残っていると感じていましたが、私はそれを考えていませんでした。 もう一度soooooooに感謝! あなたが支配する! –

+0

*赤色に変わる* ...うれしく思った。 –

+0

ありがとうございます!なぜ私はこれらすべての人工物を持っていたのか分かりませんでした。 – mk12

1

は、最初にあなたのCGContextRefを消去してみてください

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

は、おそらくあなたのイメージはゼロアルファ値を持ついくつかの着色画素がありますが、理由ブレンディング機能により、あなたはそれらを示しています。お試しください

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
+0

このブレンド関数は、あらかじめ生成されていないアルファに対してのみ良い結果をもたらします。これは、Quartzではほとんどありません。 –

関連する問題