1. 程式人生 > >Unity醬~ 卡通渲染技術分析(二)

Unity醬~ 卡通渲染技術分析(二)

前面的話

上一篇Unity醬~ 卡通渲染技術分析(一) 寫了CharaMain.cginc,服裝的渲染是怎麼實現的。這篇來分析一下頭髮跟面板的實現

頭髮

本來以為unitychan的頭髮會有各向異性的實現,沒想到她也是用的CharaMain.cginc實現的。我們來看看頭髮的材質

其他實現都一樣,也是通過高光反射貼圖來控制高光區域跟反射區域

計演算法線跟視角向量的點積,這樣的效果是越垂直於視角向量的高光越大,然後用RGB貼圖來控制哪些區域更容易出高光

反射依然是用A通道來控制,越白的地方,反射的越強

如何實現面板效果

這麼漂亮的面板,其實只用了兩個效果就實現了

漫反射+邊緣光

這一次我們來詳細說一下漫反射的實現

    float_t normalDotEye = dot( i.normal, i.eyeDir );
    float_t falloffU = clamp( 1 - abs( normalDotEye ), 0.02, 0.98 );

還是用法線跟視角向量的點積,並且限制在了0.02到0.98的範圍。
本來是夾角越小的值越大,夾角越大的值越小,用1 - 去點積的絕對值後,表示越靠近視角向量的,就越接近0。跟視角向量夾角越大,值也就越大,也就是邊緣的部位值會越大

    float4_t falloffSamplerColor = FALLOFF_POWER * tex2D( _FalloffSampler, float2( falloffU, 0.25f ) );
    float3_t combinedColor = lerp( diffSamplerColor.rgb, falloffSamplerColor.rgb * diffSamplerColor.rgb, falloffSamplerColor.a );

用剛剛求出來的值,取樣的這張衰減貼圖,也就是反映出面板質感的重要一步了!值越大,取樣出的顏色就越接近肉色。也就是越邊緣越接近肉色

FALLOFF_POWER 是一個衰減係數,skin shader中的值為1,也就是不衰減

再加上邊緣高光

總結

unity chan的技術分析差不多完了,主要的技術特點如下:

  1. 漫反射是用N.V的值去取樣一張衰減貼圖實現的,這張貼圖還可以用來實現面板效果
  2. 通過一張高光反射貼圖來控制高光的細節,以及哪些區域要顯示反射
  3. 邊緣光沒用菲涅爾反射,而是取樣rim貼圖後去乘以漫反射值得到的邊緣高光
  4. 描邊不是純色的,取樣了紋理顏色,再做了暗化處理

最後再來兩張照片吧~~ 這套渲染效果其實還是蠻不錯的

相關推薦

Unity~ 卡通渲染技術分析

前面的話 上一篇Unity醬~ 卡通渲染技術分析(一) 寫了CharaMain.cginc,服裝的渲染是怎麼實現的。這篇來分析一下頭髮跟面板的實現 頭髮 本來以為unitychan的頭髮會有各向異性的實現,沒想到她也是用的CharaMain.cginc實現的。我們來看看頭髮的材質 其他實現都一樣,也是

Unity~ 卡通渲染技術分析

前面的話 unitychan是日本unity官方團隊提供的一個Demo,裡面有很好的卡通渲染效果,值得參考學習 上圖是我整理出來的shader結構,可以看到Unity娘被拆分成了很多個小的部件,我想主要是為了掛動態骨骼吧。因為有很多部件的材質,shader其實都是一樣的可以合併成少數幾個 我打算分3個

k8s架構分析--技術流ken

repl cor 客戶端 https 配置 架構 img 前端 客戶 master節點 k8s的集群由master和node組成,節點上運行著若幹k8s服務。 master節點之上運行著的後臺服務有kube-apiserver 、kube-schedu

linux設備驅動之misc驅動框架源碼分析

linux驅動開發misc設備驅動1、misc_open函數分析 該函數在driver/char/misc.c中,misc.c是驅動框架實現的,這裏面的misc_Open函數是misc驅動框架為應用層提供的一個打開misc設備的一個接口。 1、首先我們要知道在misc.c中的misc_init函數

【雷電】源代碼分析-- 進入遊戲攻擊

engine 場景 aud 初始 cto onf 不變 addchild ems 效果圖: 程序分析: 初始化GameLayer場景觸摸。背景、音樂、UI及定時間器 bool GameLayer::init() { if (!CCLayer::init())

vlc源碼分析 播放流程

.net ges bmp pre https 學習 ref lock 流媒體 http://www.cnblogs.com/jiayayao/p/6752388.html   當點擊播放文件或者輸入要播放的文件後,vlc會執行一系列的流程。   首先需要了解視頻以及流媒體處

java代碼實現highchart與數據庫數據結合完整案例分析---折線圖

end idt 。。 客戶端 屬性 hid pla 循環 scrip 作者原創:未經博主允許不許轉載 在上一篇的博客中,展示和分析了如何做一個餅狀圖,有疑問可以參考上一篇博客。 現在分析和展示折線圖的繪制和案例分析, 先展示效果圖: 與餅狀圖不同的是,折線圖展現更多的數據

使用Apriori進行關聯分析

lis 過程 pre alt lock 不一定 根據 返回 req   書接上文(使用Apriori進行關聯分析(一)),介紹如何挖掘關聯規則。 發現關聯規則   我們的目標是通過頻繁項集挖掘到隱藏的關聯規則,換句話說就是關聯規則。   所謂關聯規則,指通過某個元素集推導出

python的引用計數分析

裏的 %20 賦值 手動 計數 python 作用域 新的 pri python所有對象引用計數被減少1的情況: 一.對象的別名被賦予新的對象; a = 23345455 # 增加了一個引用 b = a # 增加了一個引用 print(sys.getrefcount(

【高斯消元】CDOJ1784 曜的線性代數課堂

cst %d can cstring 課堂 esp 線性 memset () 高斯消元求矩陣秩板子。 #include<cstdio> #include<cmath> #include<algorithm> #include&

Java淺談數組之內存分析

說明 變量賦值 com logs .info clas code new blog 引用類型的數組的初始化 1數組元素是引用時的內存分析 package com.java.array; class Person{ public int age;//年齡

Ocata Neutron代碼分析——Neutron RPC啟動過程分析

gre add ice common multi tween wait函數 tex 依次 RPC啟動跟Neutron API的啟動在同一個函數中執行,neutron.server.wsgi_eventlet.py中的eventlet_wsgi_server。 def ev

MapReduce多種join實現實例分析

this hashmap track -- 類型 throw mapjoin pac actor 上一篇《MapReduce多種join實現實例分析(一)》,大家可以點擊回顧該篇文章。本文是MapReduce系列第二篇。 一、在Map端進行連接使用場景:一張表十分小、一張表

Spring的IOC分析源碼

width single def app ali instance exc net classpath   承接上節繼續,分析Ioc的工作原理,在典型的 IOC 場景中,容器創建了所有對象,並設置必要的屬性將它們連接在一起(同時一個叫DI“依賴註入”或DL“依賴查找”的概念

google 分屏 橫屏模式 按home鍵界面錯亂故障分析 分屏的啟動過程

activity 根據 動作 home鍵 更新 lean 全屏 擴展 ddt google 進入分屏後在橫屏模式按home鍵界面錯亂(二) 你確定你了解分屏的整個流

Fork-Join 原理深入分析

框架 ryu 循環 app bject ber setname 索引 skip ??本文是將 Fork-Join 復雜且較為龐大的框架分成5個小點來分析 Fork-Join 框架的實現原理,一個個點地理解透 Fork-Join 的核心原理。 1. Frok-Join 框架的

Linux入侵分析分析SSH登錄日誌

入侵分析 雲安全 SSH日誌 SSH登錄情況分析 1.wtmp日誌 last last -x -F 2.查看在線用戶情況 (1)w 命令用於顯示已經登陸系統的用戶列表,並顯示用戶正在執行的指令。單獨執行w命令會顯示所有的用戶,您也可指定用戶名稱,僅顯示某位用戶的相關信息。 (2)who am i

軟件性能測試技術----Linux服務器性能

bsp 分析 處理方法 性能測試 linux ron j2e 跳轉 實時 全圖: 測試目的: 測試範圍&性能指標: 測試與生產環境服務器配置不同的處理方法: 實時CPU監控: 實時內存監控: 實時網絡監控: 實時磁盤監控: 萬能命令: Linux

kafka源碼分析Metadata的數據結構與讀取、更新策略

思路 sync 源碼分析 png ada ret code 入隊 後臺線程 一、基本思路 異步發送的基本思路就是:send的時候,KafkaProducer把消息放到本地的消息隊列RecordAccumulator,然後一個後臺線程Sender不斷循環,把消息發給K

[java源碼解析]對HashMap源碼的分析

具體實現 修改 ring 數組大小 inflate 大小 transient misc ear 上文我們講了HashMap那騷騷的邏輯結構,這一篇我們來吹吹它的實現思想,也就是算法層面。有興趣看下或者回顧上一篇HashMap邏輯層面的,可以看下HashMap源碼解析(一)。