寒霜引擎中strand-based(基於線)的頭髮渲染

遊資網發表於2019-11-06
siggraph19上面,frostbite釋出的新的頭髮渲染技術,搬運如下:

https://www.bilibili.com/video/av73692434/

這篇可以說把hair render往前推進了一步,主要亮點:

開始使用線來做頭髮渲染(strand based),這個也構成了頭髮品質飛躍的一個好的基礎

進一步處理頭髮中multiple scattering的問題

[招聘貼](長期有效)

安柏霖:騰訊北極光《無限法則》《天涯明月刀》誠招程式

頭髮在遊戲中渲染的簡要歷史


寒霜引擎中strand-based(基於線)的頭髮渲染

89,kajiya-kay的頭髮光照模型

相當長時間中在用,也應屬於剛好適合當前(2019)手遊的光照模型,現在逐漸退出歷史舞臺。

siggraph03,年marschner的頭髮光照模型,是我們現在認為比較physically based的頭髮光照模型


寒霜引擎中strand-based(基於線)的頭髮渲染

這個後來在cg中被disney和weta digital進一步改進。

siggraph16,


寒霜引擎中strand-based(基於線)的頭髮渲染

unreal基於LUT的方式把marschner的頭髮模型,做了一些近似逼近,能realtime展現的比較好,但是沒有覆蓋到頭髮之間的散射(multiple scattering)以及在single scatter方面還有一些提升空間。


寒霜引擎中strand-based(基於線)的頭髮渲染

同年naughtydog的volume material render中也覆蓋了頭髮,以volume技術:

安柏霖:[sig16]《神祕海域4》中的volumetric-based materials

使用了一些偏artist的方式以及離線預先cook的方式,帶上了一些volume的概念(由於naughtydog的模型直接用於console上的遊戲中的,而非demo,所以naughtydog最後選擇不使用marschner的模型)

截止到現在,頭髮建模也是基於card的。

sig19

也就是當前,frostbite提出的基於strand的方式以及進一步處理single/multiple scattering,就是一個紮紮實實的推進了。

Strand-based Hair Rendering in Frostbite

stand based

雖然這篇文章號稱是strand based,實際上主要集中在渲染,而strand最牛的地方是在simulation。

這裡frostbite簡單帶過,可能還沒有做完等等原因。

一圖看好整體的製作流程,從點的建模,然後realtime simulation,然後point list生成頭髮的triangle strip。


寒霜引擎中strand-based(基於線)的頭髮渲染

所以這裡的simulation部分就是一個對於points的simulation,這也是一個常用的方法(比如fluid simulation)。

render


寒霜引擎中strand-based(基於線)的頭髮渲染

渲染部分就分了3塊,是

  • single scattering
  • multiple scattering
  • 髮絲的“透明渲染”

single scattering

這裡要回到marschner模型,一般我們使用的光照模型,光照的建模包括三個部分:


寒霜引擎中strand-based(基於線)的頭髮渲染

  • R Reflective paths
  • TT Transmissive paths
  • TRT Transmissive with single internal reflection

這樣三個路徑,也就是光線在頭髮中傳播並最終貢獻光照效果的主要路徑,


寒霜引擎中strand-based(基於線)的頭髮渲染


落到具體的視覺上,看起來這樣的。

中間epic在16年siggraph上面就是對這幾項做了approximation,frostbite在這裡把這個approximation提到更好的水平:


寒霜引擎中strand-based(基於線)的頭髮渲染


寒霜引擎中strand-based(基於線)的頭髮渲染


(圖中karis16,就是指unreal 16年的paper的效果)

frostbite在approximation這裡做了更多的工作,來把頭髮的擬真度進一步提升。

就大的屬性模型這裡列下:


寒霜引擎中strand-based(基於線)的頭髮渲染

類似PBR的macrofacet模型,這裡有兩大項比較重要:

  • attenuation
  • distribution

然後具體的數學選擇,frostbite主要是給出了最後結論,中間有推導成分,也有硬做擬合逼近(使用一些scale來修正)的成分。

反正最後就是達到了一個比unreal更好的擬真效果。

multiple scattering


寒霜引擎中strand-based(基於線)的頭髮渲染

multiple scattering這裡分為

  • local scattering–近距離的頭髮之間的反射
  • global scattering–遠距離的光線散射

兩塊,分別使用了現有的技術整合

按照ppt裡的說法似乎是local scattering使用了Dual Scattering Approximation。

然後global scattering使用了4層deep opacity map來做這個事情。


寒霜引擎中strand-based(基於線)的頭髮渲染

Rendering–Strand rendering


寒霜引擎中strand-based(基於線)的頭髮渲染

這裡做的事情就是讓頭髮的輕薄的透明感出來。

如果不做,就會像左邊,一堆乾草的感覺。


寒霜引擎中strand-based(基於線)的頭髮渲染

這裡是msaa+visibility buffer。

效率方面:並且如果是相近的部分,就只shading一遍(有點類似VariableRateShading的概念)這個會帶來很好的效率提升。

寒霜引擎中strand-based(基於線)的頭髮渲染


pipeline。

最終效率對比:

寒霜引擎中strand-based(基於線)的頭髮渲染


依舊還是蠻費的,不過用在主角一個人身上,應該還可以。

作者:安柏霖gamedev
專欄地址:https://zhuanlan.zhihu.com/p/89988590


相關文章