2017-02-20 133 views
1

在Open GL中,是否可以渲染具有常規深度測試的多邊形,但是如果深度緩衝區值實際寫入深度緩衝區,我想寫一個自定義值? (原因是我正在渲染一個粒子系統,它應該根據場景中的幾何體進行深度測試,但是我希望在粒子系統所在的位置寫入非常大的深度值,從而利用深度-blur後處理步驟以進一步模糊粒子系統)如何向深度緩衝區寫入與深度比較值不同的值?

更新 爲了進一步細化問題,是否有可能不經過多次渲染?

+1

如果問題是「是否可能」,那麼答案是肯定的。在FBO中渲染場景,使用其深度紋理附件在片段着色器中執行「手動」深度測試(放棄不通過深度測試的片段),並將任意深度值輸出到另一個深度緩衝區(可能如果你願意,可以通過FBO的blitting進行初始化)。沒有保證所有這一切的表現...... – peppe

+0

謝謝你更新了這個問題。 –

+0

我從來沒有使用ARB_conservative_depth,但它可以解決您的問題。 – pleluron

回答

3

你不知道。

OpenGL不允許你謊言。深度測試根據要寫入深度緩衝區的傳入值來測試深度緩衝區中的值。一旦測試通過,測試深度值將被寫入深度緩衝區。期。

您不能(ab)使用深度測試來執行測試深度值以外的其他操作。

ARB_conservative_depth/GL 4.2確實允許你非常有限有限的這種形式。基本上,你承諾實現,你只會改變深度,使其小於或大於原始值。但即使如此,它只會在特定情況下才起作用,然後只要您保持在您指定的範圍內。

執行early fragment tests同樣不允許你這樣做。規範明確規定,在着色器執行之前,深度將寫入。所以你寫gl_FragDepth的任何東西都會被忽略

+0

謝謝,基本上保守的深度會幫助我,但因爲我是opengl es 3.0,我只需要重新考慮我的算法 –

0

您可以在片段着色器中使用gl_FragDepth來編寫自定義值。

gl_FragDepth = 0.3; 

https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/gl_FragDepth.xhtml

+3

如果您寫入gl_FragDepth,則此值也將用於進行深度比較。該問題明確要求修改所寫深度的方法,而不是深度測試本身。 Afaik,除非用幾次渲染幾何體,否則不可能使用不同的值進行測試和寫入。 – BDL