聊聊引擎底層如何實現SSAO渲染

2021-09-03 07:55:05 字數 1212 閱讀 1811

網上關於ssao渲染介紹的很多,本篇部落格也是將現有演算法應用到我們自己研發的3d引擎中,ssao被稱為螢幕空間環境光遮蔽,它的原理是:對於鋪屏四邊形(screen-filled quad)上的每乙個片段,我們都會根據周邊深度值計算乙個遮蔽因子(occlusion factor)。這個遮蔽因子之後會被用來減少或者抵消片段的環境光照分量。遮蔽因子是通過採集片段周圍球型核心(kernel)的多個深度樣本,並和當前片段深度值對比而得到的。高於片段深度值樣本的個數就是我們想要的遮蔽因子。

ssao的整體流程示意圖:

1、渲染場景中的物體到g-buffer;

2、利用g-buffer中的資料,通過tbn矩陣,將取樣點從切線空間,變換到檢視空間,並在這個空間比較並計算ssao的值,並寫入ambientocculction;

3、對ambielntocculction texture進行模糊處理,去掉雜訊;

4、利用ambielntocculction texture 獲得正確的環境光照遮蔽效果。

根據以上原理我們實現出ssao的shader指令碼,實現的**如下所示:

在第2步中,我們需要取樣點,在shader**中,使用了for迴圈64次取樣,我們的取樣是在切線空間進行的,這也是為了統一處理,最後,計算取樣實際位置,再將它們變換到視空間中。這樣才能和儲存在g-buffer裡面的深度資訊進行比較。用取樣點的深度值,去和螢幕空間的深度值去比較作為是否被遮擋判斷依據。我們在shader**中實現了計算取樣點深度值和取樣點深度值的平滑插值。下面我們再看看在引擎中的c++**實現如下所示:

引擎中的**跟上篇部落格中的deferred延遲渲染類似,我們在引擎中實現的測試效果圖如下所示:

在引擎中最終渲染效果如下圖所示:

總結:ssao演算法在網上很多人為此寫過,但是都沒有介紹如何在引擎實現,我們要將單個的知識點整合應用到引擎中,這樣就可以實現乙個渲染系統,積少成多,逐步完善就形成了乙個渲染引擎。

聊聊引擎底層如何編譯Shader指令碼

由於現在的引擎都比較完善,開發者無需關心引擎底層的技術,只負責寫邏輯即可,比如unity引擎和ue4引擎,它們的出現確實為開發者提供了便利,但是對開發者來說,筆者認為並不是好事情,它導致了大部分開發者只能做些沒有任何科技含量的東西,請允許我這麼說,因為我們只是在如何用好引擎方面大動腦筋,更要命的是我...

規則引擎如何實現生產排程系統

生產排程系統是製造企業 系統的重要組成部分,對應於生產管理系統的短期計畫安排,主要目標是通過良好的作業加工排序,最大限度減少生產過程中的準備時間,優化某一項或幾項生產目標,為生產計畫的執行和控制提供指導。在不同的問題環境中,生產排程的優化目標也不同。在生產製造企業中影響生產排程的因素很多 比如裝置 ...

剖析PHP底層陣列是如何實現的

php是一門入門容易,使用範圍廣泛的語言,以其靈活性以及web後端開發被很多人熟知,也被很多人戲稱 php是世界上最好的語言 本人是一名 忠實 的phper,相信用過php的程式設計師都會體會到php陣列的靈活性,相對傳統的c語言,使用起來很是方便,擁有關聯陣列 key值可以是字串 不需要預定義陣列...