2015-10-25 78 views
0

假設我有兩個深度緩衝區(「DA」和「DB」)。我想將DA附加到幀緩衝區,並以正常/「傳統」的方式渲染它(每一個片段深度測試對GL_LESS,如果它通過,它被繪製並且深度被寫入深度緩衝區)。在OpenGL中,如何在兩個深度緩衝區之間進行深度測試?

然後,我想附上DB-在這裏我想以傳統的方式引用/使用DB,但也要用GL_GREATER對DA進行深度測試。如果片段通過了兩個測試,我仍然只想寫入深度到DB。

什麼這將做到的是在第二次抽只會畫任何東西,如果它是第一遍背後的內容,但在第二次的其他內容前

OpenGL 2.1(或OpenGL ES 2)是否提供此功能?我能做些什麼來解決它,而不是正式提供它?

如果不提供它,下面是我怎麼會做它的想法,我想被理智檢查...

您附上作爲一個深度緩衝渲染緩衝器,然後用深度手動填充它。並手動執行「如果深度超過紋理在DA」測試(當失敗,丟棄片段)。我很好奇我遇到了什麼問題?有沒有簡單的方法來模擬正式指定深度緩衝區的深度精度?表演可怕嗎?還有其他顧慮嗎?

回答

1

我不相信有一種方法可以有多個深度緩衝區。我認爲可能至少有供應商特定的擴展,但通過擴展註冊表的搜索甚至爲空。

你已經開始考慮的最後一段看起來像是想到的唯一合理簡單的選項。您使用深度紋理作爲第二個深度緩衝區,並根據它們與片段着色器中深度紋理的值進行比較來丟棄片段。

您不必手動填充深度紋理。如果深度值是作爲先前渲染過程的結果生成的,則可以使用glCopyTexImage2D()將它們從主深度緩衝區複製到深度紋理。該功能在OpenGL 2.1中可用。在較新的版本中,您還可以使用glBlitFramebuffer()執行復制。

在您的顧慮:

  • 精密是一個非常有效的關注。過去我玩過類似的東西時,我遇到了一些非常嚴重的問題。他們可能可以解決,但你一定要小心,並仔細考慮你的精度要求是什麼,以及如何在必要時對值進行欺騙。

  • 我肯定會期望表現會受到一定的影響。固定功能深度緩衝區具有優化的重要優勢,如早期的深度測試,您無法獲得「自制」深度緩衝區。不過,我不一定會期望它太可怕。如果這是您所需要的,那麼值得嘗試。

我認爲這在ES 2.0中幾乎是不行的,至少不依賴擴展。您可能會考慮將深度值寫入彩色紋理,但我認爲它會變得非常難看,效率低下。 ES 2.0非常簡單。但是對於你打算做的事情,你超出了預期的功能集。 ES 3.0增加了深度紋理以及一些可能發揮作用的其他功能。

+0

好的。害怕這一點。幸運的是,我的使用案例允許我將「DA」作爲world_pos.z <0.0進行模糊處理,並帶有*最小*僞像,這是可以接受的。 (我會接受你的回答 - 但要讓它延長一段時間,讓任何人都有機會產生一些精彩的黑客攻擊,讓我的表現不變,完美的雙深度測試)。 – Phildo