前言
開始之前,先稍微了解一下什么是3S富腊,在此引用一段維基的解釋:
Subsurface scattering (or SSS), is a mechanism of light transport in which light that penetrates the surface of a translucent object, is scattered by interacting with the material, and exits the surface at a different point.
次表面散射(或稱3S),是一種光線穿透半透明物體表面并在材質(zhì)內(nèi)相互作用而散射瑞信,最終從不同位置離開表面的光傳輸機制趴樱。
雖然解釋聽起來很晦澀,不過舉一些例子就很好理解:玉器拂到、皮膚、牛奶等半透明物體都是很常見的3S材質(zhì)码泞。在離線渲染中3S材質(zhì)早就是爛大街的東西了兄旬,不過在實時渲染中應(yīng)用的就很少有見到。離線渲染可以用光追去物理模擬光線余寥,實時不能這么做领铐,不過也可以通過一些Trick模擬近似的效果。
實現(xiàn)
主要是將幾個在Github上找到的幾個相關(guān)項目成果整合起來宋舷,參考并做了一些改進绪撵。
感謝以下的項目:
接下來將會以模擬一條中國龍造型的綠色玉器為目標進行調(diào)試。
開始
首先搭建一個場景祝蝠,從Sketchfab上下載了一條免費的中國龍模型音诈,給他附上一個Standard材質(zhì)并調(diào)整一下光滑度幻碱。此時的效果比較像國內(nèi)那些奇奇怪怪的廉價搖搖樂……
模擬散射
這一步是CP-SSSSS項目的成果,SSSSS全稱Screen Space Sub-surface Scattering细溅,是一種基于屏幕空間的后處理實現(xiàn)褥傍,是實時SSS效果中比較常見的做法。
- 先在Camera上掛上CP_SSSSS_Main后處理腳本喇聊,調(diào)整效果參數(shù)恍风。
- 然后在需要進行模擬散射效果的物體上掛上CP_SSSSS_Object腳本,調(diào)整散射顏色誓篱。散射顏色可以偏黃朋贬,這樣會有翠綠的感覺。
此時效果可以說有點意思了窜骄。明暗的對比減弱锦募,通過對內(nèi)部紋理的模糊化,產(chǎn)生了類似玉器內(nèi)部散射而產(chǎn)生的“渾濁感”啊研。
下面是他給出的基本思路御滩,有興趣的朋友可以自己去研究項目中的具體代碼。
- Blur the source image separably, based on the distance from the camera, and attenuate surrounding sample's influence based on the depth difference between this sample and the center sample (Soft Depth Bias parameter controls the maximum depth difference allowed)
基于到相機的距離党远,將原始畫面模糊處理,并根據(jù)此樣本與中心采樣點之間的深度差異衰減周圍采樣點的影響富弦。(Soft Depth Bias參數(shù)用來控制最大深度差異)- Render the scene with replaced shader, using the mask set in CP_SSSSS_Object script multiplied by the subsurface color
用替換的Shader渲染場景沟娱,再使用CP_SSSSS_Object腳本中設(shè)置的遮罩貼圖和散射顏色相乘。- Composite the blurred stuff on top of the original, multiplying it by mask from step 2, and substracting the original based on the Affect Direct parameter
將模糊處理過的圖像在原始畫面之上進行混合腕柜,與步驟2中的遮罩相乘济似,然后根據(jù)Affect Direct參數(shù)減去原始畫面。
透光性
接下來盏缤,就需要在物體本身的Shader上動手砰蠢。Shader基于PBR管線進行編寫。
自然界的玉石是半透明的唉铜,不過這里RenderType不使用Transparent台舱,作為透明物體渲染會產(chǎn)生很多其他問題,還是使用Opaque潭流,通過其他手段模擬透光性竞惋。
越是靠近物體的邊緣,厚度必然越薄灰嫉,邊緣的透光性肯定會變強——所以我加了邊緣光
嗯拆宛,沒錯,又是邊緣光讼撒,這效果雖然土但是很多時候真的很實用盎牒瘛股耽!
之后是逆光時的透光性,我這里只實現(xiàn)了平行光的透射(也就是一般情況下的太陽主光源)钳幅。做法其實比較粗暴物蝙,簡單來說就是將視線方向和反向的光線方向做點積再乘以光強,將其作為自發(fā)光(Emission)贡这。
當然上面的效果肯定是不太對的茬末,因為不同的地方厚度肯定不同,越厚的地方透光性越差盖矫,所以Shader還支持一張厚度貼圖丽惭,不過我這里沒有做(嫌麻煩)。
項目資源的話……有人想要再說吧辈双,這套東西只是玩具的程度责掏,想正兒八經(jīng)用的話肯定還要做不少改進。