簡體   English   中英

iPhone游戲2D陰影

[英]iPhone game 2d shadows

我們正在使用cocos2d創建iPhone游戲。 我們正在嘗試將幾個精靈彼此疊加,並使它們投射陰影。

現在,陰影被渲染為精靈,在大多數情況下效果很好。 但是我們只希望陰影能打到最近的圖層。

我制作了一張圖片,希望可以解釋我們要完成的工作:

這是我們目前所擁有的:

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

我們已經使用glDepthFuncGL_DEPTH_TEST進行了glDepthFunc ,但是似乎沒有任何效果。

這是渲染陰影精靈(子類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 )並且我們正在清除每個幀上的深度緩沖區。

任何幫助將非常感激!

glDepthFunc(GL_LESS)

實際上是默認值; 它的意思是“僅當當前在深度緩沖區中的物體更遠時才繪制像素”。 如果要完全相等,可以使用glDepthFunc(GL_EQUAL),但實際上,如果這樣做,您將獲得各種舍入奇數。

假定您可以為此使用深度值,如果您有十個對象,那么我建議您:

  1. 在glClear之前將glClearDepth設置為0; 這將用最接近的可存儲值填充深度緩沖區,以便使用常規深度緩沖區不會繪制其他內容。
  2. 禁用深度並繪制陰影,例如應該落在背板上的陰影; 此時,深度緩沖區仍將充滿最接近的可能值。
  3. 啟用深度測試,但將glDepthFunc設置為GL_ALWAYS。 然后以適當的深度值將所有實心矩形按先后順序繪制。
  4. 將glDepthFunc設置為GL_LESS並繪制要落在其他精靈上的陰影,每個影子都比與其關聯的精靈更靠后,但位於后面的精靈之前。

到第4步時,在繪制精靈的任何地方都將具有正確的深度信息,並且無論背景平面在哪里,都將設置最接近的可能值。 因此,正常的深度測試將在中間陰影上起作用-它們將在步驟3中繪制的任何內容之上繪制,而不在步驟2中繪制的任何事物之上繪制。

您正在使用深度緩沖區作為替代模具,舊版iPhone不支持。

如果您無法使用深度緩沖區執行此任務,那么我能想到的就是在第二個紋理單元中將陰影投影為紋理,將第一個作為蒙版紋理使用(如果您實際上是在繪制矩形,但我想您可能不是),然后為每個精靈上的每個陰影進行一次渲染。 那是一個可行的解決方案嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM