zoukankan      html  css  js  c++  java
  • 第59天Shader基本光照模型、漫反射光照算法、光照计算、高光、灰度图实现

    基本光照模型

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

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

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

  • 相关阅读:
    WPF ViewModel 调用任意前台控件的方法
    xxxx
    modelsim一些error(warning)的原因
    [verilog] inout端口处理
    [c语言]指针数组和数组指针
    电机控制术语
    MAC和PHY关系
    IAR map文件说明
    [corterm3]汇编语法
    TI 2802x系列中断系统及应用
  • 原文地址:https://www.cnblogs.com/yifengs/p/14578406.html
Copyright © 2011-2022 走看看