簡體   English   中英

在OpenGL中,如何在兩個深度緩沖區之間進行深度測試?

[英]In OpenGL, (how) can I depth test between two depth buffers?

說我有兩個深度緩沖區(“ DA”和“ DB”)。 我想將DA附加到幀緩沖區,並以常規/“傳統”方式對其進行渲染(針對GL_LESS的每個片段深度測試,如果通過,則將其繪制,並將其深度寫入深度緩沖區)。

然后,我想附加數據庫-在這里我想以傳統的方式引用/使用數據庫,而且還要使用GL_GREATER針對DA進行深度測試。 如果該片段通過了兩個測試,我仍然只想將深度寫入數據庫。

這是什么將完成什么事情在第二遍繪制如果是第一遍后面的內容只會畫畫,但其他任何內容在第二遍。

OpenGL 2.1(或OpenGL ES 2)是否提供任何此功能? 我應該怎么做才能解決它沒有正式提供的問題?

如果它不提供,這是我要怎么做的一個主意,我想進行檢查。

附加一個充當深度緩沖區的渲染緩沖區,然后手動填充深度。 並手動執行“如果深度大於DA處的紋理像素”測試(失敗時,丟棄片段)。 我很好奇我會遇到什么問題? 有沒有一種簡單的方法可以模擬正式指定的深度緩沖區的深度精度? 演出會很糟糕嗎? 還有其他問題嗎?

我不相信有辦法擁有多個深度緩沖區。 我以為可能至少有特定於供應商的擴展,但是即使如此,通過擴展注冊表進行的搜索還是空的。

您在上一段中已經開始考慮的內容似乎是想到的唯一相當簡單的選項。 您將深度紋理用作第二個深度緩沖區,並根據片段與片段着色器中深度紋理的值的比較來丟棄片段。

您不必手動填充深度紋理。 如果深度值是通過較早的渲染過程生成的,則可以使用glCopyTexImage2D()將其從主深度緩沖區復制到深度紋理。 OpenGL 2.1中提供了此功能。 在較新的版本中,您也可以使用glBlitFramebuffer()執行復制。

關於您的擔憂:

  • 精度是一個非常有效的問題。 當我過去玩類似的游戲時,我遇到了一些相當嚴重的精度問題。 它們可能可以解決,但您絕對需要提防它,並仔細考慮您的精度要求是什么,以及在必要時如何弄亂這些值。

  • 我當然希望性能會有所下降。 固定功能深度緩沖區具有大量優化的優勢,例如早期深度測試,這是“自制”深度緩沖區無法提供的。 不過,我不一定希望它會太可怕。 如果這是您需要的,那就值得嘗試。

我認為這至少在ES 2.0中是不可行的,至少不依賴擴展。 您可能會考慮將深度值寫入顏色紋理,但我認為這樣做會非常難看且效率低下。 ES 2.0非常簡單。 但是對於您計划要做的事情,您已經超出了預期的功能集。 ES 3.0添加了深度紋理以及其他可能發揮作用的功能。

暫無
暫無

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

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