【UnityShader】基础光照类型

综述

  1. 标准光照模型仅仅是一个经验模型,并不完全复合真实世界中的光照现象。
  2. 计算光照模型时,需要统一各个方向矢量所在的座标空间,且方向都是从该点指向其他处的。
  3. 渲染包含了两大部分:决定一个像素的可见性,决定这个像素上的光照计算。而光照模型是用于决定在一个像素上进行怎样的光照计算。
  4. 如何量化光?
      在光学中,使用辐照度来量化光。对于平行光来说,它的辐照度可通过计算在垂直于 l(光照方向)的单位面积上单位时间穿过的能量来得到。
      在计算光照模型时,需要知道一个物体表面的辐照度,而物体表面往往是和 l 不垂直的,可以使用光源方向 l 和表面法线 n 之间夹角的余弦值来得到。需要注意的是,这里默认方向矢量的模都为 1。
  5. 根据入射光线的数量和方向,可以计算出出射光线的数量和方向,使用出射度来描述它。辐照度和出射度之间是满足线性关系的,而它们之间的比值就是材质的漫反射和高光反射属性。
  6. 着色
      着色指的是根据材质属性(如漫反射属性等)、光源信息(如光源方向、辐照度等),使用一个等式去计算沿某个观察方向的出射度的过程。这里使用的等式也被称为光照模型(Light Model)。
      在渲染中,通常会基于表面的入射光线的入射辐射率 Li 来计算出射辐射率 Lo。这个过程往往被称为是着色过程。
  7. BRDF 光照模型
      当给定模型表面上的一个点时,BRDF 包含了对该点外观的完整的描述。在图形学中,BDRF 大多使用一个数学公式来表示,并提供了一些参数来调整材质属性。通俗来讲,当给定入射光线的方向和辐照度后,BDRF 可以给出某个出射方向上的光照能量分布。

准光照模型

  1. 标准光照模型只关心直接光照,也就是那些直接从光源发射出来照射到物体表面后,经过物体表面的一次反射直接进入摄像机的光线。
  2. 它的基本方法是,把进入到摄像机内的光线分为 4 个部分,每个部分使用一种方法来计算它的贡献度。

自发光(Cemissive

  这部分用于描述当给定一个方向时,模型表面会向该方向发射多少的辐射量。当没有使用全局光照时,这些自发光表面不会照亮周围物体,只是本身看起来更亮而已。

高光反射(Cspecular

  这个部分用于描述当光线从光源照到模型表面时,模型镜面反射产生的光。

漫反射(Cdiffuse

  这个部分用于描述当光线从光源照到模型表面时,模型向各个方向产生的光。

环境光(Cambient

  这个部分用来描述其他间接的光。

标准光照模型公式

环境光

  虽然标准光照模型的重点在于描述直接光照,但在真实的世界中,物体也可以被间接光照所照亮。间接光照指的是,光线通常会在多个物体之间反射,最后进入摄像机。也就是说,在光线进入摄像机之前,经过了不止一次的物体反射。例如,在红地毯上放置一个浅灰色的沙发,那么沙发底部也会有红色,这些红色是由红地毯反射了一部分光线,在反弹到沙发上的。
  在标准光照模型中,使用环境光部分来近似模拟间接光照。环境光通常是一个全局变量,即场景中的所有物体都是用这个环境光。
  Unity -> Window -> Rendering -> Light Setting 中设置。
  内置变量 UNITY_LIGHTMODEL_AMBIENT 可以得到环境光的颜色和强度信息。

自发光

  光线可以直接由光源发射进入摄像机,而不需要经过任何物体的反射。标准光照模型使用自发光来计算这部分的贡献度。它的计算比较简单,直接使用该材质的自发光颜色。
  计算自发光,只需要在片元着色器最后输出的颜色之前,把材质的自发光颜色添加到输出颜色上即可。

漫反射

  漫反射,是投射在粗糙表面上的光向各个方向反射的现象。当一束平行的入射光线射到粗糙的表面时,表面会把光线向着四面八方反射,所以入射线虽然互相平行,由于各点的法线方向不一致,造成反射光线向不同的方向无规则地反射,这种反射称之为“漫反射”或“漫射”。这种反射的光称为漫射光。很多物体,如植物、墙壁、衣服等,其表面粗看起来似乎是平滑,但用放大镜仔细观察,就会看到其表面是凹凸不平的,所以本来是平行的太阳光被这些表面反射后,弥漫地射向不同方向。
  漫反射光照符合兰伯特定律:反射光线的强度与表面法线和光源方向之间夹角的余弦值成正比。漫反射部分的计算如下:

Cdiffuse = (Clight*Mdiffuse)max(0,n*l)
参数:
  n 表面法线
  I 指向光源的单位矢量
  Mdiffuse 材质的漫反射颜色
  Clight 光源颜色
  max 防止物体被从后面来的光源照亮

高光反射

  经验模型,它并不完全符合真实世界中的高光反射现象。它可用于计算那些沿着完全镜面反射方向被反射的光线(物体直接反射光源),他可以让物体看起来是光泽的,例如金属材质。

Phong 模型计算高光反射的部分:

Cspecular = (Clight * Mspecular)max(0, v*r)Mgloss
参数:
  Mgloss 光泽度,反光度,控制高光区域的大小,值越大,亮点越小
  Mspecular 材质的高光反射颜色,它用于控制该材质对于高光反射的强度和颜色
  Clight 光源颜色和强度
  v 是视角方向
  r 是反射方向,可以通过计算反射方向的函数
    r = reflect(I,n)
      I,入射方向
      n 法线方向
      r = 2 (n * I)* n - I 菱形

Blinn 模型的公式

Cspecular = (Clight * Mspecular)max(0, n*h)Mgloss
参数:
  h = normalize(v + I)

比较

  在硬件实现时,如果摄像机和光源距离模型足够远的话,Blinn模型会快于Phong模型,因为此时可以任务 v 和 I 都是固定值,因此 h 将是常量。但是当 v 和 I 不固定时,Phong模型可能反而更快一些

逐像素还是逐顶点?

逐顶点

  • 顶点着色器中;
  • 也被称为高洛德着色。在每个顶点上计算光照,然后会在渲染图元内部进行线性插值,最后输出成像素颜色;
  • 优点:
    由于顶点数目往往远小于像素数目,因此逐顶点光照的计算量往往要小于逐像素光照;
  • 缺点:
    1. 由于逐顶点光照依赖于线性插值来得到像素光照,因此,当光照模型中有非线性的计算(如计算高光反射时),逐顶点光照就会出问题。
    2. 由于逐顶点光照会在渲染图元内部对顶点颜色进行插值,这会导致渲染图元内部的颜色总是暗于顶点处的最高颜色值,这在某些情况下会产生明显的棱角现象。

逐像素

  • 片元着色器中;
  • 以每个像素为基础,得到它的法线,然后进行光照模型计算。这种在面片之间对顶点法线进行插值的技术被称为 Phong 着色。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章