最近在摸unity 3D

看到很多遊戲都有實現
動畫風格著色
實在是很想試試看
 
 
找來找去
找到這篇 youtube 教學最完整
發現這一塊算是一個深坑
跟一般寫程式的邏輯真的很不一樣
 
"Toon Shader in Unity Using a Shader Graph with Custom Lighting! ✔️ 2020.3 | Game Dev Tutorial"
 
不過過程很複雜
我只能指出重點是什麼
 
1. 安裝 universal RP
就是 Shader Graph ,但是其實我不明白為什麼是安裝universal RP
給大家參考
 
 
 
 
2. 影片中的Shader Graph 版本較舊,新版 unity Shader Graph 比較新
在最後輸出的地方有點差異
可以參考
 
What's new in Unity's Shader Graph?
 
我自己是將fragment 這邊的 universal 的 material 改 unlit 就很類似影片中效果了
不然輸出結果還是會霧霧的 
給大家參考喔
 
 
 
 
3. 影片中的程式碼要自己打
但是我把前半段效果的程式打出來給大家
為什麼沒有用 Specular lighting 呢?
因為我覺得人物材質不需要這樣呈現反光
所以就弄到這邊而已
 
以下是 Lighting.hlsl 的內容
 
#ifndef CUSTOM_LIGHTING_INCLUDED
#define CUSTOM_LIGHTING_INCLUDED


void CalculateMainLight_float(float3 WorldPos, out float3 Direction, out float3 Color, out float DistanceAtten, out float ShadowAtten)
{
#if defined(SHADERGRAPH_PREVIEW)
    Direction = float3(0.5, 0.5, 0);
    Color = 1;
    DistanceAtten = 1;
    ShadowAtten = 1;
#else
#if SHADOWS_SCREEN
    float4 clipPos = TransformWorldToHClip(WorldPos);
    float4 shadowCoord = ComputeScreenPos(clipPos);
#else
    float4 shadowCoord = TransformWorldToShadowCoord(WorldPos);
#endif
    Light mainLight = GetMainLight(shadowCoord);
    Direction = mainLight.direction;
    Color = mainLight.color;
    DistanceAtten = mainLight.distanceAttenuation;

#if !defined(_MAIN_LIGHT_SHADOWS) || defined(_RECEIVE_SHADOWS_OFF)
    ShadowAtten = 1.0;
#endif

#if SHADOWS_SCREEN
    ShadowAtten = SampleScreenSpaceShadowmap(shadowCoord);
#else
    ShadowSamplingData shadowSamplingData = GetMainLightShadowSamplingData();
    float shadowStrength = GetMainLightShadowStrength();
    ShadowAtten = SampleShadowmap(shadowCoord, TEXTURE2D_ARGS(_MainLightShadowmapTexture, sampler_MainLightShadowmapTexture), shadowSamplingData, shadowStrength, false);
#endif

#endif
}

#endif
 
 
4. 大概會有這些檔案
給大家參考
 
 
 
覺得  Shader Graph 真的很神奇...
其實我懂他的視覺化函式處理的邏輯
但是問題是
 
要理解這些
會寫程式完全不夠
還要明白如何計算光源與材質的應用
這我還真的完全沒有頭緒...
 
 
給大家參考囉~