2011-08-25 109 views
0

我在cocos2d框架中使用opengl創建了一個填充紋理的多邊形。我已經使用PRKit(link)並修改了下面顯示的代碼的繪製方法。使用opengl的cocos2d中的透明PNG紋理iphone

glBlendFunc(GL_ONE, GL_ZERO); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
glBindTexture(GL_TEXTURE_2D, self.texture.name); 
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); 
glVertexPointer(2, GL_FLOAT, 0, polyTriangulatedPoints); 
glTexCoordPointer(2, GL_FLOAT, 0, textureCoordinates); 
glDrawArrays(GL_TRIANGLES, 0, trianglePointCount); 
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

當我使用透明PNG紋理時,我得到了一個奇怪的結果。透明區域不是黑色,而是一些隨機的顏色與黑色。這是我用上面的代碼得到的輸出。

transparent png

我必須保持glBlendFunc(GL_ONE,GL_ZERO),其是相同禁用共混。如果我不這樣做,cocos2d中的背景圖層會與我的紋理圖像一起添加,從而產生非常明亮的紋理。爲了添加更多的信息,我已經設置了紋理模式,以便所有圖像都加載了以下內容。 glDexImage2D(GL_TEXTURE_2D,0,GL_RGBA,width,height,0,GL_RGBA,GL_UNSIGNED_BYTE,data);

我的問題是,爲什麼我會在透明區域看到這種隨機顏色,以及如何解決這個問題?我有一種感覺,因爲我對opengl很陌生,所以我一定在做錯事。

回答

2

如果您具有完全不透明/全透明像素(alpha = 1.0或0.0)的紋理,您可以保留GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA以保持透明度。

否則,您可以使用GL_GREATER的0.0進行alpha測試(如果使用opengl 2.0,則在片段着色器中放棄關鍵字)。

但是在ios上,alpha測試比alpha混合性能差。

+0

我不知道如何使用這些信息來解決我的問題,因爲我沒有經驗的opengl,但我會看看GL_GREATER並做一些實驗。感謝您抽出時間回覆。 – maulik13

+0

如果您使用的是opengl es 1.1,您可以在glDrawArrays之前添加以下命令:glAlphaFunc(GL_GREATER,0.0f); glEnable(GL_ALPHA_TEST); – Johnmph

+0

啊我明白了。我現在在iPhone模擬器上運行這個代碼,所以我不確定它實際使用的是什麼版本的opengl。但我會試一試,看看它是如何工作的。謝謝:) – maulik13