創作內容

23 GP

【筆記】Surface Shader - 4. 自訂光照模型

作者:樂小呈│2020-07-17 18:35:48│巴幣:46│人氣:395
Surface Shader 筆記
4. Lighting - Writing Lighting Model


自訂 Lighting Model
定義自己的 Lighting Model,設計好一套表面對於光照的反應
後面在 surface計算時會自動套上 LightModel中的光照計算

此篇為實作筆記

更改 Lighting Model為自訂模型
#pragma surface surf 自訂模型命名
> #pragma surface surf OwnModel

Lighting Function

>  Lambert 模型的計算式,如果要不同的光照效果就會在這裡更改算法
half4 Lighting + 模型名 (SurfaceOutput s, 光線方向(half3), 光衰減值(half))

使用表面法線和光源方向進行點積運算,計算出光照強度(夾角大小),再乘上光照顏色後回傳
half4 LightingOwnModel (SurfaceOutput s, half3 lightDir, half atten)
{
    half NdotL = dot(s.Normal ,lightDir);
    half4 c;
    c.rgb = s.Albedo * _LightColor0.rgb * (NdotL * atten);
    c.a = s.Alpha;
    return c;
}
註: _LightColor0 定義在 UnityShader文件中,可以取得燈光的顏色


> Blinn - Phong 模型的計算式
half4 Lighting + 模型名 (SurfaceOutput s, 光線方向(half3), 視線方向(half3), 光衰減值(half))

使用視線方向+光源方向 normalize計算出的中途向量,和法線進行點積運算,計算出高光強度
half4 LightingOwnModel (SurfaceOutput s, half3 lightDir, half3 viewDir, half atten)
{
    half3 h = normalize(lightDir + viewDir);
                
    half diff = max (0,dot(s.Normal, lightDir));

    float nh = max (0, dot(s.Normal , h));
    float spec = pow (nh,48.0);

    half4 c;
    c.rgb = (s.Albedo * _LightColor0.rgb * diff + _LightColor0.rgb * spec) * atten;
    c.a = s.Alpha;
    return c;
}


> 卡通的陰影效果,需要一張由左至右深到淺,沒有漸變的 Texture

和 Lambert算法一樣,但使用點積運算出的值來分配 texture uv
Texture (sampler2D _RampTex)
half4 LightingOwnModel (SurfaceOutput s,half3 lightDir,half atten)
{
    half diff = dot(s.Normal,lightDir);
    float h = diff * 0.4 + 0.5;
    float2 rh = h;
    float3 ramp = tex2D (_RampTex, rh).rgb;

    float4 c;
    c.rgb = s.Albedo * _LightColor0.rgb  * ramp;
    c.a = s.Alpha;
    return c;
}

光照模型的筆記發完了
Surface Shader 還有一篇混和的筆記要發

然後我開始寫 vertex shader的筆記了...有夠難诶
一上來又是光照==



引用網址:https://home.gamer.com.tw/TrackBack.php?sn=4852184
All rights reserved. 版權所有,保留一切權利

相關創作

同標籤作品搜尋:Shader|筆記

留言共 3 篇留言

矮鵝
大部份都看不懂,弱弱問一下卡通效果那裡float h = diff * 0.4 + 0.5; float2 rh = h; 為啥float 可以等於 float2阿~~

07-17 18:58

樂小呈
這是填充的用法 float2 rh = 1 和 float2 rh = (1,1)是一樣的07-17 19:19
樂小呈
https://home.gamer.com.tw/creationDetail.php?sn=481960007-17 19:19
矮鵝
soudesuga~~果然是很深奧~~感謝解答~~[e19][e19][e19]

07-17 19:26

樂小呈
不客氣[e12]07-17 19:44
kiwi(薇薇安)
哇...全英文耶
英文佬(人*´∀`)。*゚+

07-17 22:11

樂小呈
並沒有,我英文超爛[e3]07-17 22:15
我要留言提醒:您尚未登入,請先登入再留言

23喜歡★angus945 可決定是否刪除您的留言,請勿發表違反站規文字。

前一篇:【專案】ACG Baha... 後一篇:【紀錄】Shader ...

追蹤私訊切換新版閱覽

作品資料夾

kktwtwyufoo大家
歡迎大家來到魔法世界的記事的小屋,有任何問題歡迎留言,小說也非常歡迎觀賞的,謝謝配合。看更多我要大聲說昨天23:14


face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】