KlayGE 4.4中渲染的改進(四):SSSSS

轉載請註明出處爲KlayGE遊戲引擎,本文的永久連接爲http://www.klayge.org/?p=2774

本系列的上一篇提到了KlayGE 4.4將會出現的高質量地形渲染。本篇仍講一個新功能,Screen Space Sub Surface Scattering(SSSSS)和Translucency。這兩個效果都是由團隊成員石裕隆實現的。html

Sub Surface Scattering(SSS)對渲染效果的提高有很明顯的左右,尤爲是皮膚和植被之類物體。早在GPU Gems 1裏就有在texture space做的近似SSSGPU Gems 3裏的方法更是大張旗鼓地用了屢次Gaussian來逼近Dipole,在texture space做6次blur後線性疊加,獲得很是真實的皮膚效果。但這麼作的開銷實在太大了。post

首先看看直接用Blinn Phong BRDF渲染的結果,皮膚自己看起來很塑料。spa

No SSS

SSSSS

到了GPU Pro裏,Jorge Jimenez等人提出了SSSSS的方法。在screen space而不是texture space作blur和疊加,以小得多的開銷很好地逼近了原有的效果。顧名思義,SSSSS的好處來自於它是screen space的,因此只須要對全屏作一次,無論有多少物體。這一點比texture space的方法就強得多了。因此這個方法迅速被UE三、CE3等主流引擎使用。orm

在覈心思想上,SSSSS的和原先的texture space方法同樣,還是把shading後的結果屢次blur併疊加的方式,來獲得SSS的效果。不一樣的是,每一次blur能夠乘上必定的權重,累加到目標texture,而不用把屢次blur的結果都保存下來,最終才累加。這樣時間和空間都省了。GPU Pro裏還進一步把6次blur減小到了4次,每次的權重也相應調整。因爲第一次blur的kernel小於1個pixel,而且權重爲1,因此第一次blur直接變成了一個copy。真正須要作Gaussian blur的只有3次了。累加的權重隨着物體的不一樣有所不一樣,GPU Pro裏列出了皮膚和大理石兩種物體的權重取值。另外,因爲是screen space,在blur的時候須要根據depth信息忽略一些pixel,不然會所有糊在一塊兒。htm

最終SSSSS能夠整理成一系列post process,並能夠用stencil把須要處理的pixel標記出來,以減小浪費。這些都是比較日常的圖像操做而已。有個特別之處在於他們的alpha workflow,那裏用了兩種日常不多用到的alpha blending操做手法。這裏詳細描述一下。blog

流程圖

這裏的流程如圖所示。Gaussian blur被分解成x和y兩個方向的兩次操做。原texture通過x方向的blur後,進入RT2。RT2進一步通過y方向的blur,同時輸出到2張texture。第一個就是日常的寫入RT1。第二個須要作blending到RTF,而這個blend的係數不是來自於PS輸出的alpha,而是RGB三個通道分別指定一個常數。遊戲

Alpha blending workflow

Independent blending

MRT若是開啓了alpha blending,那麼默認狀況下會讓全部的RT都用一樣的方式。在DX10+以上的GPU上,支持independent blending,能夠給不一樣的RT不一樣的alpha blending方式。在這裏,RT0是關閉alpha blending的,RT1打開alpha blending,但blend op等其餘參數都同樣。ip

Blend factor

最經常使用的alpha blending是SrcRGB * SrcAlpha + DstRGB * (1 – SrcAlpha)這樣的方式。而這裏須要的是RGB分別用不一樣的係數(但全屏都用那組係數),來模擬不一樣頻率的光有不一樣的穿透力。因此這裏SrcBlend須要設置爲BLEND_FACTOR,DestBlend設置爲INV_BLEND_FACTOR。而且在設置alpha blending狀態的時候提供一個float4的factor,分別表明RGBA的係數。ci

最終咱們能夠獲得一個更有皮膚質感的結果。輸入僅僅是shading的結果,以及一個調節皮膚細嫩程度的係數。開發

SSSSS

Translucency

即使加上了SSSSS,皮膚能夠逼真不少。但對於薄的地方,好比耳朵,除了SSS的貢獻,還有很大一部分其實來自於光線的透射,也就是translucency的貢獻。只有SSSSS也沒法表達出耳朵的透光,須要另外一個方法來作這件事情。幸運的是,Jorge Jimenez也開發出了這樣的方法,而且也能夠整理成一個screen space的post process。更有意思的是,translucency的結果只要直接疊加到原先shading上就能夠了。能夠單獨使用,也能夠和前面的SSSSS聯合使用。

SSSSS and translucency

這個screen space translucency的輸入是normal、diffuse、shading和shadow map,都是deferred rendering裏現成的東西。因此能夠很容易集成到現有pipeline。

本篇講了新的SSS的方法,下一篇是本系列的終結篇,將OpenGL和OpenGLES方面的改進。

相關文章
相關標籤/搜索