Unity3D 开发之shader教程(浅谈光照之漫反射diffuse)
在游戏开发过程中,光照应该是必不可少部分,当然,这是指大多数的稍微大型一些的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)的更多相关文章
- 【转】Unity3D开发之Http协议网络通信
之前unity3d项目要做跟服务器通信的模块,然后服务器那边的协议是基于http的Jsonrpc通信方式一开始,用C#的本身类HttpWebRequest来提交请求,很快就在电脑上面成功了,代码也很简 ...
- Unity3D开发之NGUI结合粒子系统的遮挡问题
原地址:http://blog.csdn.net/lihandsome/article/details/22194025 我的是NGUI3.0.3版本,在加入粒子系统的时候发现一直都是在精灵的下面,所 ...
- Unity3D开发之Mac OS 开发环境搭建 笔记
http://www.cnblogs.com/zhaoqingqing/p/3383167.html 首先上几张图: 摸索了一上午,才搞定在模拟器中运行.至于在Iphone真机中运行,虽然有开发者证书 ...
- 开园子啦(浅谈移动端以及h5的发展)
一.前言 一直以来都梦想着写几篇博客,忙于工作一直也没有抽出时间来写一下.看看大熊君.小v君等都在努力写博客,我这个不太善于言表的少年,也是在忍不住了.否则会被人家拉下更远.先简单介绍一下自己,目前我 ...
- Unity3D开发之NGUI点击事件穿透响应处理
http://www.xuebuyuan.com/1936292.html 在使用NGUI 开发2D项目的时候,发现了一个问题,就是如果点出一个菜单,然后点击菜单上面的按钮的时候就会使得按钮下面的物品 ...
- Unity3D开发之“获取IOS设备所在的国家代码"
原地址:http://dong2008hong.blog.163.com/blog/static/469688272014021025578/ 在前一段时间游戏开发中需要实现获取IOS设备所在的国家代 ...
- Unity3d 开发之 ulua 坑的总结
相同的 lua 代码在安卓上能正常运行,但在 IOS 上可能不会正常运行而导致报红,崩溃等,我在使用 lua 编程时遇到的一些坑总结如下: 1. File.ReadAllText, 诸如以下代码在 i ...
- Unity3D开发之3D按钮的声音播放
这里我们首先就简易的制作一个非常简单的3D按钮![ 图中就一个cube 加个3DText,然后我们就编写代码 [RequireComponent(typeof(CompoundButton))]//特 ...
- Unity3D开发之Matrix4x4矩阵变换
在Unity开发中时常会用到Matrix4x4矩阵来变换场景中对象的位置.旋转和缩放.但是很多人都不太理解这儿Matrix4x4变换矩阵.通过DX中的变换矩阵我来讲一讲在unity中这个变换矩阵是怎么 ...
随机推荐
- [XAF] Keep the DetailView open in a popup window
public class ViewController1 : ViewController { ListViewProcessCurrentObjectController controller; p ...
- yii2更改面包屑的首页链接
<?= Breadcrumbs::widget([ 'homeLink' => ['label' => 'Home', 'url' => Yii::$app->getHo ...
- SSIS内存不足
[SSIS.Pipeline] 信息: 缓冲区管理器检测到系统的虚拟内存不足,但无法换出任何缓冲区.考虑了 0 个缓冲区,锁定了 0 个缓冲区.或者是因未安装足够的内存或其他进程正在使用内存,以致于没 ...
- 负载均衡的mariadb集群搭建
集群介绍: Galera是一个MySQL(也支持MariaDB,Percona)的同步多主集群软件,目前只支持InnoDB引擎. 主要功能: 同步复制 真正的multi-master,即所有节点可以同 ...
- 创建动态WCF服务(无配置文件)
public class WCFServer { ServiceHost host = null; public WCFServer(string addressurl, string tcpurl, ...
- 数据库优化实践【MS SQL优化开篇】
数据库定义: 数据库是依照某种数据模型组织起来并存在二级存储器中的数据集合,此集合具有尽可能不重复,以最优方式为特定组织提供多种应用服务,其数据结构独立于应用程序,对数据的CRUD操作进行统一管理和控 ...
- Wix 安装部署教程(十三) -- 多语言安装包
这几天摸索WIX的多语言安装包(这里是Wix的setup 工程,不是Bundle),终于走通了,感谢网友uni的指点.WIX的多语言安装包能够根据系统环境自动切换界面语言,你也可以通过命令指定语言.下 ...
- 系统架构:Web应用架构的新趋势---前端和后端分离的一点想法
最近研究servlet,看书时候书里讲到了c/s架构到b/s架构的演变,讲servlet的书都很老了,现在的b/s架构已经不是几年前的b/s架构,其实b/s架构就是web应用开发,对于这样的架构我们现 ...
- java提高篇(四)-----理解java的三大特性之多态
面向对象编程有三大特性:封装.继承.多态. 封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据.对外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问方法. 继承 ...
- 用C#Winform写个简单的批量清空文件内容和删除文件的小工具
用C#Winform写个简单的批量清空文件内容和删除文件的小工具 本文介绍这个简单得不能再简单的小项目.做这个项目,有以下目的. 1 当然是做个能用的工具 2 学习使用Github 关于用VS2013 ...