继 Unity Shader
继 Unity Shader
Lambert (兰伯特)光照模型
- 基础准备
plaintext
1 | // Unity自带结构体(要引用#include "UnityCG.cginc") |
兰伯特逐顶点算法
- 兰伯特逐顶点算法公式:屏幕上对应点的颜色 =
( 光的颜色 * 物体的颜色 ) * max(0, 该点的法向量 * 该点的光照方向)
- 注意事项:在计算
n * l
时,注意:该点的法向量(往往直接获取的是物体本地坐标),该点的光照方向(往往获取的是世界坐标)是不能直接相乘的,需要把他们都换算到一个坐标系。这里换算到世界坐标下。
plaintext
1 | Shader "Custom/LambertByVertex" |
兰伯特逐像素算法
- 像素和顶点算法的区别:
- 从写法角度来看:顶点算法是在顶点着色器中写的,像素算法是在片元着色器中写的。
- 从原理角度来说:因为顶点是初始值,经过一系列计算后,数据就会和我们想要的有些偏差。
plaintext
1 | Shader "Custom/LambertByPixel" |
半兰伯特算法
- 为什么会出现半兰伯特:兰伯特的两个算法得到的球,在没有光线照射的时候都是黑色的,但玩游戏的时候往往希望,虽然光线无法照到,但我们可以看见。因为我们实际上并不是需要它看不见,只是需要它要明暗变化,所以我们在环境光的基础上加上兰伯特公式计算出的值,就有了明暗变化。
- 公式中的
n * l
值的范围是【-1, 1】
之间,我们希望把这个区间改成【0, 1】
。【-1, 1】* 0.5 + 0.5
,就可以转成【0, 1】
,0
的时候就是之前光照模型中黑色部分,越靠近1
越亮。 - 半兰伯特算法公式
- 在上图基础上:最终颜色 = 环境光 + Cdiffuse
plaintext
1 | Shader "Custom/HalfLambert" |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 SleepyLoser's Blog!
评论
Powered By Valine
v1.5.1
v1.5.1