基本光照模型
自发光:并不是光源,不会照亮其他的物体,材质的自发光颜色
环境光:其他物体反射来的光,在使用天空盒的情况,环境光就是反射出来的光在引擎中是可以调节的
在Shader中,不需要计算环境光,可以通过Unity提供的内置变量得到
漫反射光:漫反射-光线被粗糙表面向无规则的各个方向反射的现象
明暗效果,朝光面亮,背光面暗,凹凸不平的表面有明暗效果
高光反射光:镜面反射;高光不是光,体现物体材质的最亮部分
漫反射光照算法
兰伯特光照算法
漫反射 = 光照颜色 * 漫反射颜色 * max(0, dot(法线方向, 光照方向)):法线方向,光照方向需要是单位向量
光照颜色:场景中光源的颜色
漫反射颜色:定义在属性面板, 让开发者可调的
max
从两个值中取最大值
max(0, dot(法线,光照方向)),取值范围0-1
dot
计算两个向量的点乘结果
如果两个向量是单位向量,dot的结果就是两个向量夹角的余弦值
dot(法线,光照方向),取值范围-1 到 1之间
漫反射结果
当dot < 0, max = 0, 漫反射 = (0,0,0,0), 黑色, 背光面
当dot > 0, max > 0, 漫反射 > 0 , 不是黑色, 亮的, 朝光面
法线与光照的夹角 > 90, 余弦值 < 0, dot < 0
法线与光照的夹角 < 90, 余弦值 > 0, dot > 0
注意
光照方向是入射光的反方向,顶点指向光源的, 入射光方向光源指向顶点的
半兰伯特光照算法
漫反射 = 光照颜色 * 漫反射颜色 * (dot(法线方向, 光照方向) * 0.5 + 0.5):法线方向,光照方向需要是单位向量
光照计算
逐顶点光照计算
将光照计算放在顶点函数中
逐像素光照计算
将光照计算放在片元函数中
高光计算
高光点的判断
高光公式
光照颜色 * 高光颜色 * pow(max(0, dot(观察方向, 反射光方向)), 高光系数)
光照颜色 * 高光颜色 * pow(max(0, dot(法线方向, 折半方向)), 高光系数):折半方向--反射光与光照方向的中间的方向向量
dot取值范围:-1到1
max(0, dot)取值范围:0到1
pow(max, 2)
值判断
pow的最大值是1, 高光的值最亮的-》max = 1-》dot = 1-》观察方向与反射光方向的夹角为0时,cos值才是1,dot才是1
pow的值 < 1, 高光的值变暗
灰度图的实现
灰度描述黑白图像中的颜色深度,取值范围程序(0-1),美术及软件(-0255)
通常说的黑白即为灰度图
灰度实际没有色彩,RGB三个值全部相等
灰度计算
权重法
Gray = r * 0.3 + g * 0.59 + b * 0.11
平均法
Gray = (r + g + b) / 3
普通彩色图实现灰度图
Unity内置Sharder找出UI-Default.shader
修改Pass内容
修改后的shader赋给一个material,然后放在Image组件的材质里