BZ易风

导航

 

基本光照模型

自发光:并不是光源,不会照亮其他的物体,材质的自发光颜色

环境光:其他物体反射来的光,在使用天空盒的情况,环境光就是反射出来的光在引擎中是可以调节的

    在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组件的材质里

 

posted on 2021-03-25 17:28  BZ易风  阅读(213)  评论(0编辑  收藏  举报