欢迎光临散文网 会员登陆 & 注册

17.ShaderLab基本光照模型

2023-06-04 00:02 作者:机智的小草yns  | 我要投稿

记录记录...

理论基础: Blinn-Phong反射模型

  • 漫反射(Diffuse reflection)

  • 高光(Specular highlights)

  • 间接/环境光照(Ambient lighting)

1.漫反射-兰伯特余弦定律(Lambert):

 diffuse = I * cosθ

L是光源的向量,N是法线向量,I是光源强度。

漫反射 diffuse = I * cosθ

余弦定理 cosθ = L · N / (|L|*|N|)

由于L,N长度都为1, 消去|L|*|N|得

diffuse = L · N * I

排除负数,得到最终公式

diffuse =max(0, L · N) * I

核心代码

效果

逐顶点

逐顶点漫反射 完整代码

参考: https://zhuanlan.zhihu.com/p/110326132

逐像素光照同理, 略

函数解释

UnityObjectToWorldNormal 模型空间法线向量->世界空间向量

UnityObjectToClipPos 顶点坐标 模型空间->齐次裁切空间


添加环境光照

此时, 物体的背面是完全暗的,需要添加环境光照.

在原有基础上加上ambient 则能有基础亮度


2.高光反射

反射是对称的

I是光源信息,r是反射方向,viewDir是视角方向,gloss是光滑度, n是法线向量

高光反射  specular = I * max(0, r · viewDir)^gloss

反射方向  r=2(n*L)n ― L

或是使用Unity的函数 r = reflect(-L,n)  

视角向量 viewDir = UnityWorldSpaceViewDir(i.worldPos)

顶点世界坐标 worldPos = mul(unity_ObjectToWorld,v.vertex).xyz;

核心代码

函数介绍

reflect(-worldLightDir,worldNormal);  反射方向  

UnityWorldSpaceViewDir 相机方向

saturate 相当于max加clamp(0,1)

unity_ObjectToWorld 坐标变换矩阵, 用于局部转世界坐标

效果


理解公式 specular = I * max(0, r · viewDir)^gloss  (默认gloss>1)

r · viewDir 是向量的点乘, 向量都是经过归一化处理的

所以得到 r· v = |r|*|v|*cosθ = cosθ ,

相当于, 反射角与视角向量夹角越小, cosθ越大, 亮度越大

反之, 夹角>90°, 则结果负数, max后为0 , 就看不到高光

gloss相当于衰减系数, 系数越大, 光圈越小



逐像素高光反射 完整代码



17.ShaderLab基本光照模型的评论 (共 条)

分享到微博请遵守国家法律