在游戏开发过程中,光照应该是必不可少部分,当然,这是指大多数的稍微大型一些的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度的情况,请发挥空间想象能力(脑补)),这样就得到了漫反射的颜色值了!!!

心若透明,原文地址 http://www.cnblogs.com/ubanck/p/4105941.html

Unity3D 开发之shader教程(浅谈光照之漫反射diffuse)的更多相关文章

  1. 【转】Unity3D开发之Http协议网络通信

    之前unity3d项目要做跟服务器通信的模块,然后服务器那边的协议是基于http的Jsonrpc通信方式一开始,用C#的本身类HttpWebRequest来提交请求,很快就在电脑上面成功了,代码也很简 ...

  2. Unity3D开发之NGUI结合粒子系统的遮挡问题

    原地址:http://blog.csdn.net/lihandsome/article/details/22194025 我的是NGUI3.0.3版本,在加入粒子系统的时候发现一直都是在精灵的下面,所 ...

  3. Unity3D开发之Mac OS 开发环境搭建 笔记

    http://www.cnblogs.com/zhaoqingqing/p/3383167.html 首先上几张图: 摸索了一上午,才搞定在模拟器中运行.至于在Iphone真机中运行,虽然有开发者证书 ...

  4. 开园子啦(浅谈移动端以及h5的发展)

    一.前言 一直以来都梦想着写几篇博客,忙于工作一直也没有抽出时间来写一下.看看大熊君.小v君等都在努力写博客,我这个不太善于言表的少年,也是在忍不住了.否则会被人家拉下更远.先简单介绍一下自己,目前我 ...

  5. Unity3D开发之NGUI点击事件穿透响应处理

    http://www.xuebuyuan.com/1936292.html 在使用NGUI 开发2D项目的时候,发现了一个问题,就是如果点出一个菜单,然后点击菜单上面的按钮的时候就会使得按钮下面的物品 ...

  6. Unity3D开发之“获取IOS设备所在的国家代码"

    原地址:http://dong2008hong.blog.163.com/blog/static/469688272014021025578/ 在前一段时间游戏开发中需要实现获取IOS设备所在的国家代 ...

  7. Unity3d 开发之 ulua 坑的总结

    相同的 lua 代码在安卓上能正常运行,但在 IOS 上可能不会正常运行而导致报红,崩溃等,我在使用 lua 编程时遇到的一些坑总结如下: 1. File.ReadAllText, 诸如以下代码在 i ...

  8. Unity3D开发之3D按钮的声音播放

    这里我们首先就简易的制作一个非常简单的3D按钮![ 图中就一个cube 加个3DText,然后我们就编写代码 [RequireComponent(typeof(CompoundButton))]//特 ...

  9. Unity3D开发之Matrix4x4矩阵变换

    在Unity开发中时常会用到Matrix4x4矩阵来变换场景中对象的位置.旋转和缩放.但是很多人都不太理解这儿Matrix4x4变换矩阵.通过DX中的变换矩阵我来讲一讲在unity中这个变换矩阵是怎么 ...

随机推荐

  1. linux服务器分析优化

    转:http://jiekeyang.blog.51cto.com/11144634/1774473 一.系统性能分析 1.系统的性能是指操作系统完成任务的有效性.稳定性和响应速度.操作系统完成任务与 ...

  2. [XAF] 多级联列表显示

    XAF给的例子已经实现,详细可查看例子中的代码. 工作车间--工作中心--机器

  3. 【转载】硬盘MBR详细介绍

    原文地址:http://blog.chinaunix.net/uid-15007890-id-106892.html 硬盘MBR详细介绍      硬盘是现在计算机上最常用的存储器之一.我们都知道,计 ...

  4. Qt实现的根据进程名来结束进程

    1.头文件及实现部分: #include <windows.h> #include <tlhelp32.h> #include "psapi.h" #pra ...

  5. Ubuntu全新安装firefox最新版本

    Ubuntu默认安装firefox,但是自带的软件仓库是不会随firefox更新的,我在使用中老是提示flash插件需要激活,提示中可选的解决方式有三种 1.更新flash插件,但是跳转到adobe的 ...

  6. 谈谈final的作用

    前言 一直想写写这个话题.代表公司也面试过一些求职者,每次面试我必问的两个问题之一就是“请你谈一谈对于final关键字的理解”.这是一个简单的小问题,但是不要小看它,通过对这个问题的回答以及一些简单的 ...

  7. 【读书笔记】HTML5 Web存储

    PS:这里讲web存储,主要是在客户端存储的一些技术:cookie,localstorage,sessionstorage,WebSQL.     Cookie   Cookie是HTML4中在客户端 ...

  8. 5天玩转C#并行和多线程编程 —— 第三天 认识和使用Task

    5天玩转C#并行和多线程编程系列文章目录 5天玩转C#并行和多线程编程 —— 第一天 认识Parallel 5天玩转C#并行和多线程编程 —— 第二天 并行集合和PLinq 5天玩转C#并行和多线程编 ...

  9. 4、CC2541芯片中级教程-OSAL操作系统(简单AT指令实现+IIC软件和硬件实现驱动MPU6050)

    本文根据一周CC2541笔记汇总得来—— 适合概览和知识快速索引—— 全部链接: 中级教程-OSAL操作系统\OSAL操作系统-实验01 OSAL初探 [插入]SourceInsight-工程建立方法 ...

  10. [源码]NumberToUpper 数字转中文

    使用时需开启unsafe选项 构造函数有4个参数 number : 数字文本 isSimplified : 是否只使用简体中文,默认:false isMoney : 是否是金额模式(忽略小数点后3位, ...