
前言
開始之前,先稍微了解一下什么是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)相互作用而散射,最終從不同位置離開表面的光傳輸機(jī)制。
雖然解釋聽起來很晦澀,不過舉一些例子就很好理解:玉器、皮膚、牛奶等半透明物體都是很常見的3S材質(zhì)。在離線渲染中3S材質(zhì)早就是爛大街的東西了,不過在實(shí)時渲染中應(yīng)用的就很少有見到。離線渲染可以用光追去物理模擬光線,實(shí)時不能這么做,不過也可以通過一些Trick模擬近似的效果。

實(shí)現(xiàn)
主要是將幾個在Github上找到的幾個相關(guān)項(xiàng)目成果整合起來,參考并做了一些改進(jìn)。
感謝以下的項(xiàng)目:
接下來將會以模擬一條中國龍?jiān)煨偷木G色玉器為目標(biāo)進(jìn)行調(diào)試。
開始
首先搭建一個場景,從Sketchfab上下載了一條免費(fèi)的中國龍模型,給他附上一個Standard材質(zhì)并調(diào)整一下光滑度。此時的效果比較像國內(nèi)那些奇奇怪怪的廉價搖搖樂……

模擬散射
這一步是CP-SSSSS項(xiàng)目的成果,SSSSS全稱Screen Space Sub-surface Scattering,是一種基于屏幕空間的后處理實(shí)現(xiàn),是實(shí)時SSS效果中比較常見的做法。
- 先在Camera上掛上CP_SSSSS_Main后處理腳本,調(diào)整效果參數(shù)。
- 然后在需要進(jìn)行模擬散射效果的物體上掛上CP_SSSSS_Object腳本,調(diào)整散射顏色。散射顏色可以偏黃,這樣會有翠綠的感覺。

此時效果可以說有點(diǎn)意思了。明暗的對比減弱,通過對內(nèi)部紋理的模糊化,產(chǎn)生了類似玉器內(nèi)部散射而產(chǎn)生的“渾濁感”。
下面是他給出的基本思路,有興趣的朋友可以自己去研究項(xiàng)目中的具體代碼。
- 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ī)的距離,將原始畫面模糊處理,并根據(jù)此樣本與中心采樣點(diǎn)之間的深度差異衰減周圍采樣點(diǎn)的影響。(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
將模糊處理過的圖像在原始畫面之上進(jìn)行混合,與步驟2中的遮罩相乘,然后根據(jù)Affect Direct參數(shù)減去原始畫面。
透光性
接下來,就需要在物體本身的Shader上動手。Shader基于PBR管線進(jìn)行編寫。
自然界的玉石是半透明的,不過這里RenderType不使用Transparent,作為透明物體渲染會產(chǎn)生很多其他問題,還是使用Opaque,通過其他手段模擬透光性。
越是靠近物體的邊緣,厚度必然越薄,邊緣的透光性肯定會變強(qiáng)——所以我加了邊緣光
嗯,沒錯,又是邊緣光,這效果雖然土但是很多時候真的很實(shí)用啊!

之后是逆光時的透光性,我這里只實(shí)現(xiàn)了平行光的透射(也就是一般情況下的太陽主光源)。做法其實(shí)比較粗暴,簡單來說就是將視線方向和反向的光線方向做點(diǎn)積再乘以光強(qiáng),將其作為自發(fā)光(Emission)。

當(dāng)然上面的效果肯定是不太對的,因?yàn)椴煌牡胤胶穸瓤隙ú煌?,越厚的地方透光性越差,所以Shader還支持一張厚度貼圖,不過我這里沒有做(嫌麻煩)。

項(xiàng)目資源的話……有人想要再說吧,這套東西只是玩具的程度,想正兒八經(jīng)用的話肯定還要做不少改進(jìn)。