2010-01-27 53 views
16

我正在製作一款遊戲,我想在網格上的一系列精靈下創建陰影。陰影比精靈本身大,精靈動畫(即移動和旋轉)。是否有可能實現MAX(As,Ad)openGL混合?

我不能簡單地將它們渲染到sprite png中,或者陰影將與相鄰的sprite重疊。

我也不能簡單地將陰影放在較低層上,因爲當它們重疊時,它們將在它們的交叉點處創建暗帶。

這些子畫面是動畫的,所以不可能一次渲染這些子畫面。

基本上,我希望精靈的陰影混合在一起,使他們最大限度地在一個不透明的。例如:

enter image description here

相信這等同於(RS,GS,BS,最大值(如,DS)),其中I並不真正的openGL的共混關心R,G,和B ,因爲它在src和dst中始終是相同的顏色。

但是,這不是有效的openGL混合模式。有沒有簡單的方法來完成這一點,特別是在cocos2d-iphone?

我可以通過使陰影畫筆不透明,然後將它們應用於父Sprite,並使父Sprite爲40%不透明度來近似。然而,cocos2d的工作方式,這隻會將每個孩子的不透明度設置爲40%,而不是組合的精靈圖像,這會導致相同的條紋。

回答

16

好吧,我想經過很多研究,我意識到了我思考中的錯誤。

首先,有一種方法可以執行Max Alpha openGL混合,那就是使用glBlendEquations。你將不得不修改抽籤的方法來做到這一點(和作,textureNode這些方法之間切換的一些新的屬性),並使用以下兩種:

glBlendEquationOES(GL_MAX_EXT); 
glBlendEquationSeparateOES(GL_FUNC_ADD_OES, GL_MAX_EXT); 

第一個使用MAX()爲RGBA,而第二個使用RGB的標準加法,而alpha使用max()。現在

,問題是每個精靈,和它的孩子們,在Z順序,被吸引到屏幕。這意味着,在繪製第一個陰影后,它是主屏幕緩衝區的一部分。換句話說,它的不透明度發生了變化,並且使用max()混合和標準不透明背景,它現在被繪製到背景上,所以當您繪製下一個陰影時,它會做max(As,1),它是1,因爲背景是不透明的。所以我沒有達到我想要的混合。如果我的背景是透明的,它會「工作」,但是我不能在背後應用任何背景,我們只能添加到緩衝區。

我可以先使用max()混合繪製陰影,然後做一個{ONE_MINUS_DST_ALPHA,DST_ALPHA} glBlend。這是一個可行的解決方法,但是我有其他問題會導致難度。

現在,我終於意識到,真正的解決方案是使用RenderTexture將陰影渲染到單獨的緩衝區,然後將它們應用到背景。這可能會對性能產生影響,所以我們會看看它會發生什麼。

更新:

OK,我現在有一個可行的解決方案。

奇怪的是,我終究不需要這個解決方案,因爲在我的特殊情況下,綁定不夠明顯,不值得付出努力,但是這是我提出的解決方案,似乎按照我的意願去做:

  1. 首先在整個屏幕上繪製一個0%的黑色alpha png。 (我不知道這是否有必要,我不知道屏幕的默認alpha是什麼)。

  2. 使用glEquationSeperateOES(GL_ADD, GL_MAX_ENT)glBlend(GL_ONE, GL_ONE)在屏幕上繪製陰影。這將按照所述將所有陰影混合在一起,並取alpha()的max()。

    • 因爲您合成黑色,所以相當於使用glBlendEquationOES(GL_MAX_ENT)。 (X + 0 == max(X,0))

    • glBlend(GL_ZERO, GL_ONE)將消除步驟1的需要,或至少該層的要求爲0%黑色。 GL_ZERO基本上強迫它是0%黑色。

  3. 畫在地板上,這將是陰影,但使用glBlend(ONE_MINUS_DST_ALPHA, DST_ALPHA)。這樣的結果與將glBlend(SRC_ALPHA, ONE_MINUS_SRC_ALPHA)的陰影添加到地面上的效果完全相同,但是如果以這種方式實現,則無法將陰影混合在一起(請參閱答案頂部的原因)。

  4. 你完成了!這種方法的好處在於,陰影精靈可以照常動畫,而無需在單獨的renderTexture上調用「訪問」。

其餘:

我也修改CocosNode讓我添加陰影層,其鏈接到另一個CocosNode。這樣,陰影呈現爲地板的一個子元素(或陰影混合的0%黑色背景精靈),但鏈接到另一個CocosNode。當精靈移動時,如果它有陰影,它也會更新陰影位置。這使我可以在屏幕上的所有對象下面顯示所有陰影,並讓陰影自動跟隨對象。

對不起,很長的答案。也許我的解決方案很爛,但它似乎很好。

+1

感謝您對問題的跟進,並提供豐富的答案! – 2011-06-12 20:01:43

+0

也謝謝!這些信息幾乎沒有其他地方。 :) – 2012-01-18 17:51:33