2013-07-21 130 views
0

我的世界被劃分爲八叉樹(tris自動分割),每個chuck都有自己的索引緩衝區(vbo是共享的)。我已經建立了FBO,通過簡單的最小通道寫入深度紋理,但是我很難直觀地看到下一步。使用深度紋理進行深度遮擋OpenGL/GLSL(3.3/330)

我希望能夠從前面到後面組織塊體(從八叉樹返回),然後將其渲染到深度紋理。如果沒有寫入,則可以假定夾頭被隱藏。但是,我不知道在opengl中是否可以進行這樣的測試,因爲我一直認爲在FBO綁定時你無法讀取深度紋理。另外,我不知道如何進行這樣的比較測試(FBO可以以這種方式使用嗎?)

另一種方法是使用最終渲染的最終深度紋理(將其傳遞給片段着色器),並且排除被認爲在從預通道(早期Z?)獲得的深度紋理中確定的值之後的片段。

我可以解決第二種方法,但寧願忽略塊,以儘量減少繪製調用和材料綁定。

我希望有人能夠解決這個問題,因爲我已經找到了「最好的方法」來做到這一點,但是我對這些方法和FBO的知識相對有限,而且我只使用FBO進行陰影映射燈。

對不起,這是一個麻煩 - 我知道硬件遮擋測試,但希望實現一個更通用的深度遮擋系統,不需要「等待」。

編輯:只是一個說明,對於前傳我只是要呈現一個緊身邊界框開始。

+0

這是不是很清楚你問的是什麼。你所談論的許多算法都沒有意義。例如,如果您有最終的深度緩衝區(又名:您進行了深度預處理),爲什麼您需要片段着色器來「解開碎片......」?這當然會發生,只需再次渲染對象即可。 –

+0

嗨尼科爾,我想我明白你在說什麼。當GFX插件在片段着色器中進行插值時,GFX卡將自動消除未通過深度測試的片段,對嗎?如果是這種情況,那麼我甚至不需要進行預傳?然而,我想要弄清楚八叉樹返回的卡盤深度遮擋,以防止在最終渲染過程中綁定它們(包括紋理等)。可以把它看作是一個BSP系統,但只能用三角形塊,並在第二次傳遞之前使用深度緩衝區解散整個塊。 – Rebirth

回答

0

如果您不是在尋找OpenGL Occlusion Queries那麼您可能需要基於CPU的解決方案。

我推薦給你的是一個軟件光柵器。
渲染CPU上的遮擋物/遮擋物而不是GPU。
實施例的算法:

  1. 柵格化所有封堵器的z值到緩衝器(例如壁)。
  2. 對於每個被遮擋物(例如傢俱和其他小物體),通過將它們的邊界框柵格化到相同的緩衝區(不寫入它)來檢查遮擋。
  3. 如果在呈現被遮擋物邊界框時存在未被遮擋的像素,則呈現被遮擋物。

這是一個可以在任何硬件上運行的解決方案。

以下是關於遊擊如何實現它在殺戮地帶兩個偉大的演講(渲染CPU上封堵器和柵格化occludee檢查閉塞邊框):
http://de.slideshare.net/guerrillagames/practical-occlusion-culling-on-ps3
http://de.slideshare.net/guerrillagames/practical-occlusion-culling-in-killzone-3

下面是Crytek公司是如何做的(讀背部和修改先前幀的深度緩衝器和光柵化occludee在它的上面)包圍盒:
http://de.slideshare.net/TiagoAlexSousa/secrets-of-cryengine-3-graphics-technology

而且繼承人呈現約蔭3閉塞culli ng:
http://de.slideshare.net/Umbra3/visibility-optimization-for-games

也有intel(也使用軟件光柵器)的演示。

無論如何:沒有完美的解決方案來解決您的問題。你必須自己決定什麼最適合你。