Matcap Shader 詳解【1】 - 基礎思想與Unity中實現

Matcap Shader 詳解【1】 - 基礎思想與Unity中實現

來自專欄技術美術 ShadingArtist小屋

Matcap簡介

Matcap Shader是一種在某些層面能替代甚至超越PBR的次時代渲染方案。

它的效率極高、計算成本極低,顯示效果極佳,卻能完美運行於不同的移動平台,併兼容AR、VR設備,所以極具研究與實用價值。

但Matcap也有很多局限性和缺點,此系列文章就是用於講解Matcap的實現方法與針對其問題的優化。

Unity Community Wiki 中將其定義為:

用於均一表面反射材質的著色器,在Zbrush/Mudbox等軟體中被廣泛運用。它藉助一幅含有球面的圖片作為視線空間的環境映射,計算成本非常低廉,當相機不轉動時視覺效果極其出色。

ZB中的Matcap

Matcap原理

Matcap的原理並不複雜,就是使用一張中間為球面的圖片作為不同法線方向的光照顏色,然後將這些顏色根據模型的法線信息渲染到相應位置。

例如下圖圖二(黑白)中,球形就是Matcap貼圖,箭頭代表了右下朝向的法線,車與人的模型法線朝向此相同方向時,就會渲染為球形貼圖上相應點的顏色——白色。

matcap原理示意圖

Matcap的優點

正如文章開始所說,Matcap一大優勢是——運算效率極高,計算成本極低,在很多場合卻能夠替代PBR。用Unlit級別的計算成本,獲得3A級的渲染效果,這正是Matcap吸引人的地方。

除此之外,Matcap也擁有PBR不具備的優勢——充滿了很多新的可能性,只需簡單更換Matcap貼圖,就能實現各種神奇的渲染效果。具體請看下方示例,每幅左上角為Matcap取樣貼圖。

粗糙金屬質感

冰霜質感

素描質感

粉晶質感

幽靈質感

卡通質感

車漆質感

如何實現Matcap

Matcap的原理簡單,實現起來也並不複雜,下面是基礎Matcap在U3D中的實現代碼:

Shader "TJia/Matcap_Basic" { Properties { _MatCapDiffuse ("MatCapDiffuse (RGB)", 2D) = "white" {} } Subshader { Tags { "RenderType"="Opaque" } Pass { Tags { "LightMode" = "Always" } CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct v2f { float4 pos : SV_POSITION; float2 NtoV : TEXCOORD1; }; v2f vert (appdata_tan v) { v2f o; o.pos = UnityObjectToClipPos (v.vertex); o.NtoV.x = mul(UNITY_MATRIX_IT_MV[0], v.normal); o.NtoV.y = mul(UNITY_MATRIX_IT_MV[1], v.normal); return o; } uniform sampler2D _MatCapDiffuse; float4 frag (v2f i) : COLOR { fixed4 matcapLookup = tex2D(_MatCapDiffuse, i.NtoV * 0.5 + 0.5); fixed4 finalColor = matcapLookup; return finalColor; } ENDCG } }}

說明:

  1. LightMode 為 Alyaws,這樣無論是否有燈光都會渲染
  2. UNITY_MATRIX_IT_MV 用於 將法線從模型空間轉化到視覺空間,以便映射Matcap採樣貼圖,使用方法可自行查詢

  3. NtoV(視覺空間下的二維法線向量)值域為[-1,1],而貼圖UV的定義域是[0,1],所以用 uv = i.NtoV * 0.5 + 0.5 的方法進行了映射

最終結果如下,可以更換MatcapDiffuse來更換渲染效果:

基礎Matcap的缺陷

Matcap最初廣泛用於ZBrush等3D雕刻軟體,並沒有固有色貼圖、法線貼圖等需要,所以 Unity Community Wiki 才將其定義為均一表面顏色使用的著色方法。

正因如此,基礎Matcap的第一個缺陷就是只適用於單一材質、單一固有色且無法線貼圖細節的模型

此外,經典BPR光照模型還包含了漫反射、高光反射、菲涅爾、金屬度、光滑度等參數,也是基礎Matcap不具備的(第二個缺陷)

第三個缺陷是Matcap無法響應光源與相機位置的變化,原因很簡單——Matcap採樣貼圖是靜態的,通過相機空間映射的

第四個問題在於Matcap只能表現單一質感,不支持多種質感或者混合質感的材質

最後的問題是,Matcap在平面、圓柱體及相近形體的渲染上效果並不好(見下圖)

Matcap在平面及圓柱體渲染上表現很糟

針對以上缺陷,我提出了一些優化的方案,以解決Matcap面對的部分問題,在保留它優點的基礎上進一步提高其實用性。

每個缺陷的具體原因及解決方法可以參考此系列之後的文章。


系列鏈接(未完待續):

Matcap Shader 詳解【1】 - 基礎思想與Unity中實現

Matcap Shader 詳解【2】 - Matcap的固有色貼圖與法線貼圖

Matcap Shader 詳解【3】 - 利用Matcap實現基本PBR光照模型

Matcap Shader 詳解【4】 - 多材質與混合材質


推薦閱讀:

第三章 System Part2(From3.3 To 3.3.1)
自製遊戲引擎 - 0 - Hello world
從零開始寫引擎(OPENGL)(三)-骨骼動畫系統(2)
Korok字體系統設計
基於Unreal引擎的大地形載入研究

TAG:遊戲從業者 | 遊戲引擎 | shader |