2010-10-17 104 views
2

我們正在使用cocos2d來製作iPhone遊戲。我們正在嘗試將多個精靈層疊在一起,並讓它們投射陰影。iPhone遊戲2d陰影

現在,陰影呈現爲精靈,大部分工作正常。但我們只希望陰影擊中最近的層。

我做了一個形象,希望能解釋什麼是我們正在努力做到:

這裏就是我們目前所面對的:

基本上我們希望精靈只渲染與z緩衝區深度相同的陰影部分。

我們玩過glDepthFuncGL_DEPTH_TEST,但似乎沒有任何工作。

下面是我們如何繪製陰影精靈(子類CCSprite):

- (void)draw { 

    glDisable(GL_BLEND); 

    glEnable(GL_DEPTH_TEST); 
    glDepthFunc(GL_LESS); 

    glDepthMask(GL_FALSE); 
    [super draw]; 
    glDepthMask(GL_TRUE); 

    glDisable(GL_DEPTH_TEST); 

    glEnable(GL_BLEND); 
} 

GL_BLEND電話是隻有在那裏,所以我們可以在任何時候看到的精靈。

所有不是陰影的精靈都使用glDepthMask(GL_TRUE),我們正在清除每個幀的深度緩衝區。

任何幫助將不勝感激!

回答

1
glDepthFunc(GL_LESS) 

實際上是默認值;它的意思是「只有當深度緩衝區中的物體距離更遠時才繪製像素」。如果你想完全相等,你可以使用glDepthFunc(GL_EQUAL),但實際上,如果你這樣做,你會得到各種各樣的古怪事物。

假設你能夠使用深度值用於此目的,如果有10個對象,那麼我建議你:

  1. 集glClearDepth到0之前,你glClear;這將填充深度緩衝區和最近的可存儲值,以便在正常的深度緩衝區內不會繪製其他任何東西。
  2. 禁用深度並繪製陰影,例如它們應該落在背板上;此時您的深度緩衝區仍將充滿最接近的可能值。
  3. 啓用深度測試,但將glDepthFunc設置爲GL_ALWAYS。然後將所有實心矩形以深度值適當設置的順序繪製。
  4. 將glDepthFunc設置爲GL_LESS並繪製意圖落在其他精靈上的陰影,每個陰影都位於比它們關聯的精靈更靠後的位置,但位於後面的精靈之前。

當您到達第4步時,您會在繪製精靈的任何位置都有正確的深度信息,並且您將在背景平面的任何位置設置最接近的可能值。因此,正常的深度測試將在中間陰影上起作用 - 它們將繪製第3步中繪製的任何東西的頂部,而不是第2步中繪製的任何東西的頂部。

你有點使用深度緩衝區作爲替代模板,舊iPhone不支持。

如果你不能使用這個任務的深度緩衝區,那麼我所能想到的就是將陰影投影爲第二個紋理單元中的紋理,使用第一個紋理單元作爲掩碼紋理(或者,如果你是實際上繪製矩形,但我想你可能不會),並且每個陰影中的每個精靈都會執行一次渲染傳遞。這是一個可通行的解決方案嗎?

+0

謝謝!使用你的方法,我能夠得到我們正在尋找的結果,不幸的是以幀率爲代價。現在,它可以按照預期工作,我可以開始尋找優化性能的方法。 – aegzorz 2010-10-23 16:28:57