Unity中的基础光照

Wesley13
• 阅读 677

渲染包含了两大部分:决定一个像素的可见性,决定这个像素上的光照计算。

光照模型就是用于决定在一个像素上进行怎样的光照计算。

一、光源

  在实时渲染中我们通常把光源当做一个没有体积的点。

  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模型 来计算高光反射:

                    Unity中的基础光照

        cspscular = (clight . mspecular) max(0, Unity中的基础光照  . r)mgloss

    mgloss是材质的光照度(gloss),也被称为反光度(shininess),它用于控制高光区域 的大小,mgloss越大两点越小。mspecular是材质的高光反射颜色,用于控制该材质对于高光反射的强度和颜色。clight是光源的颜色和强度。

    Blinn模型(亦称为Blinn-Phong)

      和phong模型相比,Blinn提出了一个简单的修改方法来得到类似的效果。它的基本思想是避免计算反射方向Unity中的基础光照 。为此,Blinn模型引入了一个新的矢量Unity中的基础光照 ,它是通过对Unity中的基础光照 Unity中的基础光照 的取平均后再归一化得到的。

                    Unity中的基础光照

        Unity中的基础光照

cspscular = (clight . mspecular) max(0, Unity中的基础光照  . Unity中的基础光照 )mgloss

    在硬件实现时,如果摄像机和光源距离模型足够远的话,Blinn模型会快于Phong模型。这是因为,此时可以认为Unity中的基础光照 Unity中的基础光照 都是定值,因此Unity中的基础光照 是一个常量。但当其中一个不是定值时,Phong模型反而更快一些。

    局限性:很多重要的物理现象无法用Blinn-Phong模型表现出来。例如菲涅尔反射(Fresnel reflection)。其次,Blinn-phong模型是各项同性(isotropic)的,也就是说,当我们固定视角和光源方向旋转这个表面时,反射不会发生任何改变。但是有些表面是具有各向异性反射性质的,例如金属拉丝,毛发等。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Karen110 Karen110
3年前
一篇文章带你了解JavaScript日期
日期对象允许您使用日期(年、月、日、小时、分钟、秒和毫秒)。一、JavaScript的日期格式一个JavaScript日期可以写为一个字符串:ThuFeb02201909:59:51GMT0800(中国标准时间)或者是一个数字:1486000791164写数字的日期,指定的毫秒数自1970年1月1日00:00:00到现在。1\.显示日期使用
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
Android So动态加载 优雅实现与原理分析
背景:漫品Android客户端集成适配转换功能(基于目标识别(So库35M)和人脸识别库(5M)),导致apk体积50M左右,为优化客户端体验,决定实现So文件动态加载.!(https://oscimg.oschina.net/oscnet/00d1ff90e4b34869664fef59e3ec3fdd20b.png)点击上方“蓝字”关注我
Wesley13 Wesley13
3年前
unity2017 光照与渲染(一)
光照&渲染(基于unity2017.2.0)1.CustomSkybox天空盒最丰富的环境光a.TextureShape改成Cube。b.把图片直接丢给天空,就会自动生成材质。c.参数Exposure曝光度,Rotation旋转天空盒。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这