我们是如何看到这个世界的

从宏观上来说,渲染包含了两大部分

  • 决定一个像素的可见性
  • 决定这个像素上的关照计算

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

通常来讲,我们要模拟真实的光照环境来生成一张图片,需要考虑以下3种物理现象

  1. 光线从光源中被发射出来
  2. 光线和场景中的一些物体相交:一些管线被物体吸收了,二另一些被散射到其他方向
  3. 摄像机吸收了一些光,产生了一张图像

下面我们会针对每个部分进行解释

光源

在光学里,我使用辐照度来量化光。对于平行光来说,它的辐照度课通过计算在垂直于l的单位面积上单位时间内穿过的能量来得到。在计算光照模型时,我们需要知道一个物体表面的辐照度,而物体表面和l往往不是垂直的,我们可以使用光源方向l和表面法线n之间的夹角的余弦值来得到。如下图所示

因为辐照度和照射到物体表面时光线之间的距离d/cosΘ成反比,因此辐照度就和cosΘ成正比,cosΘ可以使用光源方向l和表面法线n的点击积来得到。

吸收和散射

光线由光源发射出来后,就会与一些物体相交。通常,相交的结果有两个:散射和吸收

散射

散射值改变光线的方向,但不改变光线的密度和颜色光线。
在物体表面经过散射后,有两种方向

  • 一种是将会散射到物体内部,这种现象被称为折射或者透射
  • 另一种将会散射到外部,这种现象被称为反射

对于不透明的物体,折射进入物体内部的光线还会继续与内部的颗粒进行相交,其中一些光线最火会重新发射出物体表面

那些从物体表面重新发射出的光线将具有和入射光线不同的方向分布和颜色
为了区分两种不同的散射方向,我们在光照模型中使用不同的部分来计算它们

  • 高光反射部分表示物体表面是如何反射光线的
  • 漫反射部分表示有多少光线会被折射、吸收和散射出表面

我们可以计算出光线的数量和方向,通常我们使用出射度来描述它
辐照度和出射度之间是满足线性关系的,而它们之间的比值就是材质和漫反射和高光反射属性

吸收

吸收只改变光线的密度和颜色,但不会改变光线的方向

着色

着色指的是,根据材质属性(如漫反射属性等)、光源信息(如光源方向、辐照度等),使用一个等式去计算沿着某个观察方向的出射度的过程
我们也把这个等式称为光照模型

BRDF光照模型

当已知光源位子和方向、视角方向是,我们就需要知道一个表面是如何和光照进行交互的
BRDF就是用来回答当光线从某个方向照射到一个表面时,有多少光线被折射,反射的方向有哪些
BRDF都是对真实场景进行理想化和简化后的模型,也就是说,它们并不能真实的方言物体和光线之间的交互,这些光照模型被称为经验模型

标准光照模型

  • 自发光——本书使用emissive来表示,这个部分用于描述当给定一个方向时,一个表面本身会像该方向发射多少辐射量。需要注意的是,如果没有使用全局光照(global illumination)技术,这些自发光的表面并不会真的照亮周围的物体,而是它本身照亮了而已
    光线也可以直接由光源发射进入摄像机,而不需要经过任何物体的反射标准光照模型使用自发光计算这个部分的贡献度。它的计算也很简单,就是直接使用了该材质的自发光颜色
  • 环境光——本书会使用cambient来表示。它用于描述其他所以的间接光照
    虽然标准光照模型的重点在于描述直接光照,但在真实世界中,物体也可以被间接光照(indirect light)所照亮。间接光照指的是,光线通常会在多个物体之间反射,最后进入摄像机,也就是说,在管线进入摄像机之间,经过了不止一次的物体反射
    例如在红毯上放置一个沙发,那沙发底部也会有红色
  • 高光反射——本书使用cdiffuse来表示。这个部分用于描述,当光线从光源照射到模型表面时,该表面回向每个方向散射多少辐射量
    这里的高光反射是一种经验模型,也就是所它并不完全符合真实世界中的高光反射现象。
    它可用于计算那些沿着完全镜面反射方向反射的光线,这可以让物体看起来有是有光泽的,例如金属材质
    计算高光反射需要知道的信息比较多,比如表面法线、视角方向、光源方向、反射方向等。在本书中我假设这些矢量都是单位矢量,下图给出了这些方向矢量

在这四个矢量在,我们实际上只需要知道其中3个矢量即可,而第4个矢量——反射方向可以通过其他信息计算得到:

这样,我们就可以利用Phong模型来计算高光反射的部分:

其中mgloss是材质的光泽度(gloss),也被称为反光度(shininess)。它用于控制高光区域的的“亮点”有多宽,mgloss越大,亮点就越小。mspecular是材质的高光反射颜色,它用于控制该材质对于高光反射的强度和颜色。clight则是光源的颜色强度。同样,这里也需要防止 结果为负数
和上述的Phong模型相比。Blinn剔除了一个简单的修改方法来得到类似的效果。它的基本思想是避免计算反射方向r,为此,Blinn模型引入了一个全新的矢量h,它是通过vl的取平均后在归一化得到的,即

然后实用n和h之间的夹角进行计算,而非v和r之间的夹角,如下图所示

总结一下,Binn模型公式如下

在硬件实现时,如果摄像机和光源距离模型足够远的话,Blinn模型会快于Phong模型,这是因为,此时可以认为vl都是定值,因此h将是一个常量。但是,当v或者l不是定值是,Phong模型可能反而更快一些,需要注意的是,这两种光照模型都是经验模型,也就是说,我们不应该认为Blinn是对“正确”的Phong模型的近似。实际上,在一些情况下,Blinn模型更符合试验结果

  • 漫反射——本书使用cdiffuse来表示。这部分用于描述,当光线从光源照射到模型表面时,该表面会在完全镜面反射方向散射多少辐射量
    漫反射关照是用于对那些被物体表面随机散射到各个方向的辐射度进行建模的。在漫反射中,视角的位置不是重要的,因为反射是完全随机的,因此可以认为在任何反射方向上的分布都是一样的。但是,入射光线很重要
    漫反射光照符合兰伯特定律(Lambert’s law):反射光线的强度与表面法线和光源方向之间的夹角的余弦值成正比。因此,漫反射部分的计算如下

    其中n是表面法线,l是指向光源的单位矢量,mdiffuse是材质的漫反射颜色,clight是光源颜色,需要注意的是,我们需要防止法线和光源方向点乘的结果为负值,为此,我们使用取最大值的函数来将其截取到0,这可以防止物体被从后面来的光源照亮

Unity中的环境光和自发光

在标准光照模型中,环境光和自发光的计算是最简单的,我们先打开Lighting窗口

我们可以在这设置环境光的颜色

目前环境光的强度已经改成了Intensity Multiplier,可以在这设置

大多数物体是没有自发光特性的,在本书中绝大部分Shader中都没有计算自发光部分。如果要计算也非常简单我们只需要在片元着色器输出最后颜色之前,把材质的自发光颜色添加到输出颜色上即可

Unity Shader中的基础光照与标准光照模型(自发光、环境光、高光反射、漫反射)、BRDF光照模型相关推荐

  1. Unity Shader入门精要学习笔记 - 第6章 开始 Unity 中的基础光照

    转自冯乐乐的<Unity Shader入门精要> 通常来讲,我们要模拟真实的光照环境来生成一张图像,需要考虑3种物理现象. 首先,光线从光源中被发射出来. 然后,光线和场景中的一些物体相交 ...

  2. unity入门精要之第6 章 Unity 中的基础光照概述-1

    Unity系列文章目录 文章目录 Unity系列文章目录 前言 6.1 我们是如何看到这个世界的 6.2 标准光照模型 参考 前言 渲染总是围绕着一个基础问题:我们如何决定一个像素的颜色?从宏观上来说 ...

  3. unity入门精要之第6 章 Unity 中的基础光照--环境光和自发光

    Unity系列文章目录 文章目录 Unity系列文章目录 前言 一.Unity 中的环境光和自发光 二.在Unity Shader 中实现漫反射光照模型 参考 前言 但这种模型有很多局限性.首先,有很 ...

  4. Unity 中的基础光照

    通常来讲,我们要模拟真实的光照环境来生成一张图像,需要考虑三种物理现象. 首先,光线从光源中被发射出来. 然后,光线和场景中的一些物体相交:一些光被物体吸收了,而另一些光被散射到其他方向. 最后,摄像 ...

  5. unity入门精要之第6 章 Unity 中的基础光照---实现高光反射光照模型

    Unity系列文章目录 文章目录 Unity系列文章目录 前言 参考 前言 在6.2.4 节中,我们给出了基本光照模型中高光反射部分的计算公式: 从公式可以看出,要计算高光反射需要知道4 个参数:入射 ...

  6. Unity Shader中各部分定义内容详解

    Unity Shader中各部分定义内容详解 样板 Shader "Practice/Unlit/SimpleUnlit" {Properties{_MainTex (" ...

  7. unity shader中 CG和GLSL之间矩阵存储方式的差异

    在unity shader中计算切线空间光照的时候发现TBN矩阵在计算后并没有转置,这和在GLSL.线代中的计算方法相差一个转置的步骤,因为在GLSL中直接求得的TBN矩阵是切线空间到世界空间的变换, ...

  8. Unity Shader屏幕特效基础OnRenderImage()函数

    前言:  unity shader中的pass是会顺序执行的,但是由于在图像处理中我们常常需要使用一个pass的处理结果作为另一个pass的输入,这个时候就需要用到OnRenderImage()函数了 ...

  9. Unity 5 中的全局光照技术详解

    简介 全局光照,简称GI,是一个用来模拟光的互动和反弹等复杂行为的算法,要精确的仿真全局光照非常有挑战性,付出的代价也高,正因为如此,现代游戏会先一定程度的预先处理这些计算,而非游戏执行时实时运算. ...

最新文章

  1. App字体大小不随系统改变而改变
  2. git使用报错:fatal: Couldn't find remote ref master的解决方法
  3. 串口通信模块2:串口通信编程基础(打开、配置)
  4. PYTHON的主模块
  5. leetcode 57. 插入区间
  6. java音频采样_音频重采样的坑
  7. 采用GDI生成Code39条形码
  8. @程序员,如何在买房时不被宰?
  9. js面向对象写法及栈的实现
  10. 打印机质量测试软件,打印质量测试
  11. 如何快速转载网页博客
  12. sklearn:make_blobs聚类数据生成器
  13. 爆款“小黄鸭”之后,实在RPA助力电商人双11提销量
  14. 同花顺股票交易接口定义被类实现
  15. 整理下使用yum localinstall做离线安装的点
  16. 论文笔记(十七):Brax - A Differentiable Physics Engine for Large Scale Rigid Body Simulation
  17. 56网首发2012APEC青创会主题微电影
  18. 2021第7届中国大学生程序设计竞赛CCPC广州站, 签到题4题
  19. 胡立阳:股市赚钱的人都不“正常”
  20. 一个在黑客界引起轰动的菜鸟教材---跟我学编程系列

热门文章

  1. jquery中国地图热点提示信息,可作链接特效
  2. 【吭】django项目运行jira项目突然报错TypeError: session() takes 1 positional argument but 2 were given
  3. 西安建筑科技大学883程序设计2021真题分享
  4. 决明子保健枕头好吗,有什么用?
  5. WP下ListBox的绑定和效果
  6. 正则表达式提取新闻发生时间
  7. Character类型
  8. POJ 2251,3D迷宫。
  9. 只需3步,修改SQLServer的sa密码
  10. Java爬虫demo,爬取文章链接