2013-10-31 74 views
1

我開始向我的遊戲引擎添加延遲着色,我在理解如何從深度紋理中檢索眼睛空間座標時遇到了一些麻煩。從深度紋理獲取眼睛空間點

我已閱讀在this post和我的理解大約兩個方法:如果我存儲我的深度在GL_DEPTH_ATTACHMENT我的幀緩衝區

  • 第一種方法會奏效。
  • 第二種方法需要我在我的Shader中計算我的深度,並將其存儲在GL_COLOR_ATTACHMENTn中。

第二種方法的重建對於我所需要的來說似乎太複雜了,所以如果可能的話,我寧願不使用它。

用於重建眼睛的座標,所述第一方法將紋理座標,深度,以及1.0vec4一個w,乘以由逆透視矩陣,然後除以它的w結果。

此方法的工作原理與存儲在我的GL_DEPTH_ATTACHMENT紋理中的深度保持一致,是否足夠準確以進行點亮?

如果它不能改變,那麼我需要怎樣處理我的深度才能使它工作?

回答

1

您可能會計算着色器中的深度並將其存儲在顏色緩衝區中的原因是深度緩衝區是非線性的。由於透視校正,爲了獲得線性深度(您希望進行視圖/世界空間位置重建),您必須對採樣的深度值做更多的事情。

作爲一種解決方案,寫一個線性值到gl_FragDepth是很誘人的,我也看到一些教程甚至做到這一點......但是不要這樣做!它破壞了現代硬件深度緩衝區優化,如分層z緩衝和早期深度測試。

您指出的第二種方法不僅是不必要的複雜,而且效率也非常低。在重建期間,您最好簡單地線性化非線性深度緩衝區。一些額外的片段着色器指令應該比創建G緩衝區期間將深度寫入兩個位置(隱式寫入深度緩衝區,加上一個到專用顏色緩衝區)更快。

+0

我在嘗試渲染我的深度緩衝區時發現了這個問題:http://www.ozone3d.net/blogs/lab/20090206/how-to-linearize-the-depth-value/。這是否會按照您描述的方式將深度線性化? – jbills

+0

@jbills:是的,這正是你需要做的產生線性深度值。 –

+0

感謝線性化後,我可以按照前面描述的步驟進行操作嗎? – jbills