2016-05-18 89 views
2

我正在嘗試執行this SAO algorithm可伸縮環境Obscurance呈現問題

我得到以下結果:

result

我想不通爲什麼我鼻子上的牆壁之上,這似乎是一個Z緩衝區的問題。

這裏是我的輸入值:

const float projScale = 100.0; 
const float radius = 0.9; 
const float bias = 0.0005; 
const float intensityDivR6 = pow(radius, 6); 

我使用的是原來的着色器無需修改,但我禁用深度緩衝的貼圖的使用。

我的深度緩衝(在不同的場景,不好意思):

depth

回答

2

它應該與zbuffer線性化的問題,或者它不是介於-1和1

1

謝謝布魯諾,我終於弄清楚了什麼是問題。 第一個是我沒有正確地轉換我的Z,他們使用特定的預處理來使Z線性化,並將其置於-1和1之間。我使用了不兼容的方法來完成此操作。

我還必須直接在投影矩陣中否定我的近平面和遠平面值,才能正確計算一些制服。

結果: result

+0

您可以發佈解決方案嗎? 我正在實施相同的算法,我可能會遇到一些您遇到的問題。我沒有否定我的近/遠飛機,但它似乎沒有做到這一點。然而,只要我的相機靠近一個物體,我就會得到一個錯誤的自遮擋(http://i.imgur.com/OWriRrK.png)。我不確定這一點,但它可能與您遇到的問題有關。 –

+0

您應該否定近平面和遠平面,以避免在某些情況下看起來得到正確結果的錯誤積累。因此,我花了一些時間來了解我的問題。你的飛機前角有AO,因爲它不是無限的,除非我不確定你的結果是否錯誤。你有其他照片嗎? –

+0

是的,我在Sponza場景中還有其他人。場景適合半徑23單位的邊界球。結果非常好:http://i.imgur.com/lXFuOXP.png(你可以在右上角看到場景設置)。但是每當我增加半徑時,我都會看到相同的效果,當我將相機放在近處時,我會看到自我遮擋: http://i.imgur.com/TqRaoy0.png 有些東西我忘了要提到的是,根據相機從屏幕上實際看到的內容,我的近/遠會自動更新以適合相機。 –

0

我有一個類似的問題,有視覺錯閉塞,聯繫到近/遠,所以我決定給你我做了什麼來解決這個問題。

我曾經遇到過的問題在之前的評論中有描述。當相機靠近物體或半徑真的太大時,我正在自我遮擋。

如果您深入瞭解從深度緩衝區值到相機空間值(reconstructCSZ函數g3d engine)的轉換,您將看到,如果使用深度緩衝區替換深度爲0,則可以爲您提供近平面積極的近/遠。所以,這意味着每當你在模型外部得到一個水龍頭時,你會得到一個az分量等於near,這會給az的接近0的碎片給出錯誤的遮擋。 你基本上必須丟棄每個水龍頭位於近平面上,以避免在計算完整貢獻時將它們考慮在內。