• Unity3D 开发之shader教程(浅谈光照之漫反射diffuse)


      尊重他人智慧成果,欢迎转载,请注明作者 心若透明,原文地址 http://www.cnblogs.com/ubanck/p/4105941.html

      在游戏开发过程中,光照应该是必不可少部分,当然,这是指大多数的稍微大型一些的3D游戏会需要,给模型或者山山水水加上光照,会看上去更加的真实,获得更好的体验。一个本身不发光物体显示什么颜色,在于本身反射什么颜色,比如一块石头,在太阳光的照射之后,你看到是红色的,而太阳光是白色的,白色是因为RGB组合而成,这快石头吸收了绿色和蓝色,反射了红色,那么你看到这块石头就会是红色的!

      那么谈到反射,就分为了漫反射(diffuse)和镜面反射(specular),先说漫反射

    因为表面凹凸不平,所有法线的方向也就不一致,那么反射的光线也就不一致,何为法线,所谓法线,就是垂直与表面的那条线(看到一个哥们儿说因为法线一定是垂直的线,像个公正不阿的法官,所以叫法线),入射光线到表面,令入射光线与反射光线的夹角相等,得到反射光线,而我们在计算中是试用dot(N,L)来得到一个值,N代表法线向量,L代表入射光线的向量表示,先对这两个向量进行归一化处理(使用normalize函数)所谓的归一化处理,即是让这个向量的模等于1(其实就是让向量除以他的模,这块可以参考3D图形学基础里面提到的向量部分),而dot函数的公式为向量点乘,即N*L=|N|*|L|cosΘ  由于之前对N与L进行了归一化处理,那么N*L=cosΘ,回顾一下三角函数,也就是说,入射光线与法线夹角在(0,90)之间,角度越大,那么值就越小。

      下面给出漫反射的公式:diffuse = Kd * lightColor * max(N·L,0)。

      首先kd为光强,也就是光照的强度,准确的说是材质对光的反射系数,在0到1 之间,根据名称可以自己想象一下。其次lightColor,这玩意儿是指光的颜色,它里面有rgb三个分量,用句牛逼的话说,世界上所有的颜色都可以用RGB来表示,通过在计算机中RGB三个不同的值可以匹配出无数种颜色,8bit的颜色通道可以表示出0-255,那么256的3次方,就可以组合得到16777216种颜色,当然,人的眼睛貌似感觉不到那么多颜色,扯远了,回到刚刚那个话题,光的颜色有了,在乘以max(N*L,0),为什么要这样做?因为如果夹角大于90度,那么就会出现负数,负数是没有意义的(至于为什么会出现大于90度的情况,请发挥空间想象能力(脑补)),这样就得到了漫反射的颜色值了!!!

    (就是简单是梳理一下思路!漫反射的代码,待会儿上传一下,作为总结)

  • 相关阅读:
    【剑指offer】面试题35:第一个只出现一次的字符
    【剑指offer】面试题34:丑数
    【剑指offer】面试题33:把数组排成最小的数
    【剑指offer】面试题32:从1到n整数中1出现的次数
    【剑指offer】面试题31:连续子数组的最大和
    【剑指offer】面试题30:最小的 k 个数
    【剑指offer】面试题29:数组中出现次数超过一半的数字
    【剑指offer】面试题28:字符串的排列
    【剑指offer】面试题27:二叉搜索树与双向链表
    【剑指offer】面试题26:复杂链表的复制
  • 原文地址:https://www.cnblogs.com/ubanck/p/4105941.html
Copyright © 2020-2023  润新知