blinn-phong 光照模型_标准本地光照模型----Phong式光照

8298852ba644d5cb547f7155fe3be6fb.png

标准本地光照模型----Phong式光照1. 标准光照(Phong)模型1.1 光照模型概述
在渲染方程中BRDF描述了在可见表面光的散射分布情况。其中用到积分并要采集所有可能反射到表面的光线信息,在实时渲染中并不实际(开销巨大),大多数情况下在通过对BRDF的模拟或者简化来计算光照,而模拟简化后的光照计算公式就称为光照模型。本章介绍的主体是标准光照模型,尽管在现实使用中已经不是最新技术,但仍然是学习光照的很好的切入点。1.2 标准光照模型概述
标准光照模型(Phong式光照模型)是对渲染方程(参见光照概述)做了简化模拟:保留自发光部分cemis, 将渲染方程中的积分部分简化为三种光照来源分别为: 镜面反射部分cspec,漫反射部分cdiff,和环境光部分camb。因此在标准光照模型里渲染方程就被简化成了:
Lout(x,ωˆout, λ) = Lcemis((x,ωˆout, λ) + Lspec((x,ωˆout, λ) + Ldiff((x,ωˆout, λ) + Lamb((x,ωˆout, λ)。 接下来会逐一介绍每部分的计算方式。 2. 标准光照模型中的镜面反射(Spec)2.1 镜面反射部分光照概述
镜面反射部分的光照反应的是可见表面的光泽程度,表面越光滑镜面反射的辐射量越大相反越粗糙则漫反射的辐射量越大。2.2 镜面反射部分所需的数据
在考虑镜面反射部分计算时影响镜面反射辐射量的因素如下图:

32f4af412d725dfba936b5a287d4a730.png


其中n是表面法线,v是相机方向,l是光照方向,r是反射方向,θ是观察向量与反射向量的夹角。假设以上向量均为单位向量,根据下图:

3700b49473712e21755164dc78d9d4bd.png


根据上图辅助线可以计算出反射向量 : r = 2(n.l)n - l
以上提到的数据只是直观上感觉会影响光照反射量的因素,实际除此之外还有表面材质也会影响光照反射的辐射度。2.3 镜面反射最终颜色计算
在标准光照(Phong)模型中,对镜面反射后的颜色计算简化为以下公式:

52a7b1d212f2dc05d76777bac22fa0c3.png


Cspec为最终颜色,Sspec为光照的镜面反射颜色,Mspec为材质中的镜面反射颜色,⊗表示颜色分量分别相乘,Mgls表示表面光泽度。由以上公式可知光泽度越大v.r不变的情况下其反射出来的光的辐射度越小,反过来说要保持同样大小的辐射度v和r向量就要越靠近,此时反射出来的光斑越小越集中。光泽度越小光斑范围越大越分散也越接近漫反射。下图明显明显的展示出光泽度和材质中的反射值对效果的影响:

74117fc13ef95ab79b1e3fb1a715479e.png

2.4 Blinn-Phong光照模式的改进
Blinn-Phong光照模式是对Pong式光照模式的改进,其基于的出发点有两个:1. 标准光照模型如果v和l在发现的同一侧则可能发生v和r的夹角大于90°的情况导致r.l<0从而使得光照被截断或者过度不自然 2. 当观察者距离相对于物体较大时可以将v近似当做不变的常(光照方向一般也不会发生变化因此无需每帧计算)。 为了解决问题1,Blinn-Phong光照模型舍弃使用反射向量r,进而引入半向量h(是对v和l求平均然后对其归一化)代替反射向量r。

c7035419bcb676a7205525fb076809b8.png


Bilin-Phong光照模式下反射部分计算公式如下:

59cd3e67a1ab1f7edee74416e169c22c.png

3. 标准光照模型中的漫反射(Diffuse)
漫反射部分光照模拟的是粗糙表面对射入光线沿各个方向随机反射部分光的辐射度。由于是随机反射我们可以认为向各个方向反射的量是相同的,也就是说漫反射任意方向的BRDF的值都是相同的(在标准光照模型中可以简化为跟材质有关的参数),回想下渲染方程在任何一个方向(我们关心的是相机方向)的光辐射量计算公式为:

3e58d7eef0b83df27fa3fb04dd45a693.png


Lin(x,ωˆin, λ)表示在x位置入射角度为ωˆin颜色为λ的光辐射量,在标准光照模型组的漫反射中简化为漫反射照Sdiff,BRDF函数在漫反射中可以简化为跟材质相关的参数Mdiff此时标准光照模型中漫反射部分光照计算方程就简化成了:

5ae49f90ddb9afb7150f88e04ad4a72b.png

4. 标准光照模型中的漫反射(Diffuse)4.1 环境光部分光照
镜面反射和漫反射模拟的都是光线射到可见表面后反射进入相机的过程,整个过程仅在可见表面发生过一次反射,但真实世界中光子可能在相同/不同物体之间经过多次反射后才进入眼睛(相机),而对这 部分光照的模拟就是环境光,计算公式如下:

ec8d9645864062d9405b11bec6a5c103.png


Mamb是材质的光环境光颜色(一般与漫反射颜色相同)。Gamb是环境光值,一般是个全局变量用于整个场景。(但某些技术如光照探针可能提供额外的带方向的环境光)4.2 自发光部分光照
自发光用于模拟部分发光体(如:灯泡)自身发出的光线直接入射眼睛的光照。自发光仅仅描述的是表面自身并不会影响其他物体表面,也就是说自发光并非真正的光源。因此自发光仅仅和表面材质本身有关:

02b004b2fcb7e23204f605f2521be6a9.png

5. 标准光照模型中的光照方程
前面介绍了编制光照模型中模拟的各个光照分量的计算方法,对于单一光源的光照方程是以上四个光照分量之和

0cc92bb434bf05a4562b8357cbc80791.png


多数情况下物体表面并无自发光,下图为各部分光照单独计算的效果:

29fec4dcb5dcfc99bdb79d26e666ad8c.png


多光源叠加下,由于环境光和自发光与光源本身无关因此多光源叠加公式如下:

f2486765cebe8beb59e21a07ee608068.png

6. 标准光照模型的限制
我们所介绍的标转光照模型其实就是Blinn-Phong式光照模型,该光照模型并非完美的,例如一些物理特效的效果(如菲涅尔现象)它并不能很好的模拟,但以该光照模型作为学习光照模型的切入点是因为其他光照模型中有很多也与之类似的概念和理念方便学习其他光照模型。7. 光照与Shading7.1 Shading概述
Shading中最常用的两个Shader是VertexShader和FragmentShader多数情况下在VertexShader中进行顶点转换等操作在FragmentShader中将顶点颜色光栅化到像素。使用光照计算模型对可见表面进行绘制,根据光照计算对象及光栅化的方式不同可以分为三种方式分别为:Flat Shading , Gouraud Shading, Pong Shading。7.2 Flat vs Gouraud vs Pong Shading FlatShading是针对每个三角面的法线进行光照计算,并将计算结果应用到整个三角面,除软件渲染外几乎从未使用过该方案。 GouraudShading又被称为VertexLighting是在顶点级别进行光照计算,在通过线性插值的方式光栅化到三角形内所有像素点。 PongShading又被称为FragmentLighting是在像素级进行光照计算,对每个像素先确定表面法线(可以通过对面法线插值更多的是通过法线贴图)然后使用该表面法线进行完整的光照方程计算。 FlatShading GouraudShading PongShding三者越往后效果越好性能也越低。以下三种模式对比:

14ef964bab153433df8fd8061aecd328.png

7.3 VertexLighting下光照计算方
如果细心就能发现标准光照模型中的光照方程并不适合GouraudShading方式(该方式是逐顶点计算发生在VertexShader中,光照方程用会用到表面材质信息,在VertexShader中无法逐像素采样)。因此需要将部分材质相关的计算放回片元着色器,需要对光照方程进行简单修改,具体如下:

d994257d46d1194cd25f5ce45ad48b3c.png

1254df53a5d15771d8ecea47fded446d.png


由以上公式可以将光照计算方程拆为两个部分,在顶点着色器中逐顶点进行如下与法线有关的计算:

274308a3e2690c4abdbd8e00e128a474.png

注:法线光线等光照计算我们即可以先将所有向量转化到世界空间计算也可以全部转化到相机空间计算,甚至可以在模型空间计算,但一定要保证所有向量在同一空间,法线的空间转换矩阵与其他向量不同为M(t)-1(参见之前笔记)
在片元着色器中逐像素进行材质相关的计算:

712ac9e6d501fb5df660889149c82619.png

注: 如果材质相关的参数是定制而并非来自材质贴图则此部分计算也可以移入顶点着色器8. 总结

  • 标准光照模型将表面光照量简化为四个分布分别是:镜面反射量,漫反射量,环境光量和自发光量,其中漫反射和镜面反射是依赖具体光源的,环境光一般是全局的,自发光一般仅与材质有关。
  • Blinn-Phong是对Phong式光照模型的改进,解决了相机角度与反射角度大于90°导致的高光截断的问题,使用视向量与入射光的半向量h来代替反射向量r。Cs = Ss * Ms * (n.h)的gls次方(光泽度)
  • 标准Blinn-Phong光照模型使用PhongShading逐像素进行光照计算,为提升性能可以改为逐顶点计算光照方程的向量部分运算,再在片元着色器中逐像素进行材质相关计算。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值