Unity中的基础光照
渲染包含了两大部分:决定一个像素的可见性,决定这个像素上的光照计算。
光照模型就是用于决定在一个像素上进行怎样的光照计算。
一、光源
在实时渲染中我们通常把光源当做一个没有体积的点。
1.1 辐照度
在光学里,使用辐照度(irradiance)来量化光。对于平行光来说,它的辐照度可以通过计算在垂直于光的方向的单位面积上单位时间内穿过的能量来得到。
1.2 吸收和散射
光线由光源发出后,与物体相交会有两个结果:散射(scattering)和吸收(absorption)。
散射:只会改变光线的方向,但不改变密度和颜色。
吸收:只会改变光线的密度和颜色,但不会改变方向。
光线在物体表面经过散射后,会有两种方向:
① 将会散射到物体内部,这种现象被称为折射(refraction)或者透射(transmission)。
② 散射到外部,这种现象称为反射(reflection)。
为了区分这两种不同的散射方向,光照模型中使用了不同的部分来计算他们。
高光反射(specular): 表示物体表面是如何反射光线的。
漫反射(diffuse):表示有多少光线会被折射、吸收和散射出表面。
岀射度(exitance):出射光线的数量和方向。
二.光照模型
着色(shading):根据材质属性(如漫反射属性等)、光源信息(如光源的方向,颜色,辐照度等),使用用一个等式去计算沿着某个观察方向的岀射度的过程。
这个等式称为光照模型(Lighting Model)。
2.1 BRDF光照模型 (Bidirectional Reflectance Distribution Function)
用来回答当光线从某个方向照射到一个表面时,有多少光线被反射,反射的方向。当给定模型表面上一个点时,BRDF包含了对该点外观的完整描述。在图形学中,BRDF大多使用一个数学公式来表示,并且提供一些参数来调整材质属性。通俗来讲,当给定入射光线的方向和辐照度后,BRDF可以给出在某个出射方向上的光照能量分布。
2.2 标准光照模型
标准光照模型只关心直接光照(direct light),也就是那些直接从光源发射出来照射到物体表面后,经过物体表面的一次反射直接进入摄像机的光线。
基本方法是,把进入到摄像机内的光线分为4个部分,每个部分使用一种方法来计算它的贡献度。
自发光(emissive)部分
这个部分用来描述当给定一个方向时,一个表面本身会向该方向发射多少辐射量。需要注意的是,如果没有使用全局光照(global illumination)技术,这些自发光的表面并不会真的照亮周围的物体,而是它本身看着更亮了。
高光反射(specular)部分
用来描述当光线照到模型表面时,该表面会在完全镜面反射方向散射多少辐射量。
漫反射(diffuse)部分
光线照到模型表面时,表面会向每个方向散射多少辐射量。
环境光(ambient)部分
描述其他所有的间接光照。
2.2.1 环境光
间接光照:光线通常会在多个物体之间反射,最后进入摄像机,也就是说,在光线进入摄像机之前,经过了不止一次的物体反射。
在标准光照模型中,使用一种被称为环境光的部分来近似模拟间接光照。环境光的通常是一个全局变量,既场景中所有物体都使用这个环境光。
2.2.2 自发光
光照可以直接由光源发射进入摄像机,而不需要经过任何物体的反射。在标准光照模型中,直接使用该材质的自发光颜色。
2.2.3 漫反射
用于对那些被物体表面随机散射到各个方向的辐射度进行建模。
漫反射光照符合兰伯特定律(Lambert‘s law):反射光线的强度与表面法线和光源方向之间夹角的余弦值成正比。
cdiffuse = (clight * mdiffuse) max(0, n ▪ I)
n是表面法线,I是指向光源的单位矢量,mdiffuse是材质的漫反射颜色,clight是光源颜色。
半兰伯特(Half Lambert)光照模型:为了改善兰伯特模型下,在光照无法到达的区域,模型的外观通常是黑色的,没有任何明暗变化,模型失去了细节表现。需要注意的是,半兰伯特是没有任何物理依据的,仅仅是一种视觉加强技术。
广义的半兰伯特光照模型的公式如下:
cdiffuse = (clight * mdiffuse) (α(n.I) + β)
绝大多数情况下,α和β的值均为0.5。
2.2.4 高光反射
这里的高光反射是一种经验模型,用于计算那些沿着完全镜面反射方向反射的光线,可以让物体看起来有光泽。
Phong模型 来计算高光反射:

cspscular = (clight . mspecular) max(0, . r)mgloss
mgloss是材质的光照度(gloss),也被称为反光度(shininess),它用于控制高光区域 的大小,mgloss越大两点越小。mspecular是材质的高光反射颜色,用于控制该材质对于高光反射的强度和颜色。clight是光源的颜色和强度。
Blinn模型(亦称为Blinn-Phong):
和phong模型相比,Blinn提出了一个简单的修改方法来得到类似的效果。它的基本思想是避免计算反射方向。为此,Blinn模型引入了一个新的矢量
,它是通过对
和
的取平均后再归一化得到的。

cspscular = (clight . mspecular) max(0, .
)mgloss
在硬件实现时,如果摄像机和光源距离模型足够远的话,Blinn模型会快于Phong模型。这是因为,此时可以认为和
都是定值,因此
是一个常量。但当其中一个不是定值时,Phong模型反而更快一些。
局限性:很多重要的物理现象无法用Blinn-Phong模型表现出来。例如菲涅尔反射(Fresnel reflection)。其次,Blinn-phong模型是各项同性(isotropic)的,也就是说,当我们固定视角和光源方向旋转这个表面时,反射不会发生任何改变。但是有些表面是具有各向异性反射性质的,例如金属拉丝,毛发等。
Unity中的基础光照的更多相关文章
- 第五章 Unity中的基础光照(2)
目录 1. Unity中的环境光和自发光 2. 在UnityShader中实现漫反射光照模型 2.1 实践:逐顶点光照 2.2 实践:逐像素光照 2.3 半兰伯特模型 1. Unity中的环境光和自发 ...
- Unity Shader入门精要学习笔记 - 第6章 开始 Unity 中的基础光照
转自冯乐乐的<Unity Shader入门精要> 通常来讲,我们要模拟真实的光照环境来生成一张图像,需要考虑3种物理现象. 首先,光线从光源中被发射出来. 然后,光线和场景中的一些物体相交 ...
- 第五章 Unity中的基础光照(3)
目录 1. 在Unity Shader中实现高光反射光照模型 1.1 实践:逐顶点光照 1.2 逐像素光照 1.3 Blinn-Phong光照模型 2. 召唤神龙:使用Unity内置的函数 @ 1. ...
- 第五章 Unity中的基础光照(1)
[TOC] 渲染总是围绕着一个基础问题:我们如何决定一个像素的颜色?从宏观上来说,渲染包括了两大部分:决定一个像素的可见性,决定这个像素上的光照计算.而光照模型用于决定在一个像素上进行怎样的光照计算. ...
- 【Unity Shader】---基础光照
一.[标准光照模型]1.自发光emissve:描述一个表面本身会发散多少光.在没有使用全局光照时,这些自发光是不会真正照亮周围物体. 自发光就是直接由发光体发射进入摄像机,不经过任何反射,在标准光照模 ...
- Unity 5.6中的混合光照(上)
https://mp.weixin.qq.com/s/AbWM21sihHw5pFdMzENDPg 在Unity 5中,光照得到了很大的改进.现在,创建高度逼真的游戏已成为可能.但是,出于对性能的考虑 ...
- 浅析Unity中的Enlighten与混合光照
0x00 前言 在Unity的5.6版本之前的5.x中,主要使用了Geomerics公司的Enlighten[1]来提供实时全局照明以及烘焙全局照明,在5.6之后Unity引入了新的Lightmapp ...
- Unity 5.6中的混合光照(下)
https://mp.weixin.qq.com/s/DNQFsWpZm-ybIlF3DTAk2A 在<Unity 5.6中的混合光照(上)>中,我们介绍了混合模式,以及Subtracti ...
- 【Unity3D基础教程】给初学者看的Unity教程(七):在Unity中构建健壮的单例模式(Singleton)
作者:王选易,出处:http://www.cnblogs.com/neverdie/ 欢迎转载,也请保留这段声明.如果你喜欢这篇文章,请点推荐.谢谢! 该博客中的代码均出自我的开源项目 : 迷你微信 ...
随机推荐
- 【Python】 垃圾回收机制和gc模块
垃圾回收机制和gc模块 Py的一个大好处,就是灵活的变量声明和动态变量类型.虽然这使得学习py起来非常方便快捷,但是同时也带来了py在性能上的一些不足.其中相关内存比较主要的一点就是py不会对已经销毁 ...
- 数据库 --> MySQL存储引擎介绍
MySQL存储引擎介绍 MyISAM是MySQL的默认数据库引擎(5.5版之前),由早期的ISAM(Indexed Sequential Access Method:有索引的顺序访问方法)所改良.虽然 ...
- 详细说明手工创建oracle数据库实例
手工建库比起使用DBCA建库来说,是比较麻烦的,但是如果我们学好了手工建库的话,就可以使我们更好地理解Oracle数据库的体系结构.手工建库须要经过几个步骤,每一个步骤都非常关键.它包括:1. 创建必 ...
- Docker深入浅出系列教程——Docker简介
我是架构师张飞洪,钻进浩瀚代码,十年有余,人不堪其累,吾不改其乐.如果你和我的看法不一样,请关注我的头条号,我们一起奇闻共赏,疑义相析. 本节属于入门简介,从三个小方面进行简单介绍Docker. Do ...
- React Native 轻松集成统计功能(iOS 篇)
最近产品让我加上数据统计功能,刚好极光官方支持数据统计 支持了 React Native 版本 第一步 安装: 在你的项目路径下执行命令: npm install janalytics-react-n ...
- 201621123057 《Java程序设计》第9周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 在上一周的总结上做了一点补充 1.2 选做:收集你认为有用的代码片段 2. 书面作业 本次作业题集集合 1. ...
- 201421123042 《Java程序设计》第7周学习总结
1. 本周学习总结 1.1 思维导图:Java图形界面总结 2.书面作业 1. GUI中的事件处理 1.1 写出事件处理模型中最重要的几个关键词. 事件源 事件对象 事件监听器 事件适合配器 1.2 ...
- HTML5 拖放(Drag 和 Drop)详解与实例(转)
公司要开一个技术分享会,给我们出了几个简单的题去实现,其中有如何实现表格中列之间的拖拽,我知道html5中有个新方法可以实现,但是没有认真学习,现在闲了去学学,发现关于drag和drop的文章有很多, ...
- 根据抽象工厂实现的DBHelpers类
public abstract class DBHelper { public static SqlConnection conn = new SqlConnection("server=l ...
- php的控制器链
控制器之间协同工作就形成了控制器链· 比如在一个控制器的方法中,创建另外一个·控制器,创建对象,然后调用第二个控制器方法,那么在第一个控制器分配给视图的变量,在 第二个控制器的方法中对应的视图也是可以 ...