渲染管线中光照的计算

渲染管线中光照的计算

前言

首先我们来看一下同一个模型在有光与无光下的区别:

无光:
在这里插入图片描述
有光
在这里插入图片描述
很明显的感知就是无光下渲染的模型,给人的感受是扁平化,不像一个模型,但是在经过光照渲染之后,就可以感受出立体效果。光照下的模型经过光照(lighting)与阴影(shading)的叠加,给我们展现出了很好的立体效果。而我们所看到的颜色,是依靠模型的材质呈现的。

看下图,在同一个平行光源(后面会讲解)下,同一个物体,不同材质下所呈现的结果不同,材质呢,有粗糙度,如石头,与瓷砖,当然还有金属度、折射率、透明度等。A球就是带透明的,因此,他在光照的影响下产生了折射,所以我们能看见它背后的物体,而B球则不能。人眼看见光的原因是因为光照射到物体上时候,一部分会被吸收,一部分会被反射,反射的光进入人眼,光受体感受到刺激,将信号传入大脑,也就是我们所能看到颜色的原因。
在这里插入图片描述

法向量

法向量是指垂直于给定曲面、曲线或几何体的向量(对于曲面就是垂直于切线空间)。下图就是相对于A点的法向量
在这里插入图片描述

朗伯余弦定律

光可以看作是光子的集合,在空间中按特定的方向传播。每个光子都载有(光)能量。光源每
秒发出的(光)能量称为辐射通量(radiant flux)。而单位面积上的辐射通量密度(irradiance,称为辐(射)
照度)。我们将辐射通量用来确定表面某区域所接收到的光量(即眼晴感受到的明亮度)。

一个面元的辐亮度或光亮度在其表面上半球的所有方向相等时,则有 E θ = E n c o s θ = E n ( n ⋅ L ) E_θ=E_ncosθ = E_n(n·L) Eθ=Encosθ=En(nL)
式中, E θ E_θ Eθ E n E_n En分别表示面元在 θ 角(与表面法线夹角)方向及其法线方向的辐射强度或光强度, n n n是法向量, L L L光向量
(可以理解越接近于垂直照射的光,能量越强)
考虑到 ( n ⋅ L ) = c o s θ (n·L) =cosθ (nL)=cosθ 这值是有可能小于0的,因此,给它限定了一下范围
f ( θ ) = m a x ( c o s θ , 0 ) = m a x ( n ⋅ L , 0 ) ( 也就是要求它大于等于 0 ) f(θ) = max(cosθ,0)=max(n·L,0) (也就是要求它大于等于0) f(θ)=max(cosθ,0)=max(nL,0)(也就是要求它大于等于0)
这部分建议大家参考百度文库的资料

漫反射

当光照射到物体表面上某个点时候,一部分会被吸收,一部分会被四处反弹。(因为看似是平面的物体,其实放大之后,是凹凸不平的)
在这里插入图片描述
假设一点的有80%白光的入射光量,而这点的漫反射率是50%的红光,100%的绿光,75%的蓝光,则入射光量值 B L = ( 0.8 , 0.8 , 0.8 ) B_L=(0.8,0.8,0.8) BL=(0.8,0.8,0.8),漫反射率为 m d = ( 0.5 , 1.0 , 0.75 ) m_d=(0.5,1.0,0.75) md=(0.5,1.0,0.75)则这个点的反射光量是:
c d = B L ⊙ m d = ( 0.8 , 0.8 , 0.8 ) ⊙ ( 0.5 , 1.0 , 0.75 ) = ( 0.4 , 0.8 , 0.6 ) ( ⊙ 对应元素相乘 ) c_d =B_L⊙\\ m_d = (0.8,0.8,0.8)⊙(0.5,1.0,0.75)\\ = (0.4,0.8,0.6)\\ \quad\\ (⊙对应元素相乘) cd=BLmd=(0.8,0.8,0.8)(0.5,1.0,0.75)=(0.4,0.8,0.6)(对应元素相乘)
根据朗伯余弦定律就有了:
c d = m a x ( L ⋅ n , 0 ) ⋅ ( B L ⊙ m d ) c_d =max(L·n,0) ·(B_L⊙m_d) cd=max(Ln0)(BLmd)

环境光照

我们不仅要考虑光源的影响,还需要考虑间接光照的影响,比如,太阳光照射到水面,然后水面反射到镜子里,镜子再反射到某个物体上,其实真实世界中,间接光照是很多的,就比如。下方是环境光照的方程:
c a = A L ⊙ m d c_a =A_L⊙m_d ca=ALmd
A L A_L AL指定了表面接收到的间接光量(环境光量), m a m_a ma依旧是漫反射率。对于环境光照的计算,是在当前的光照模型中,都按照统一的环境光照计算,并没有进行真实的物理世界的模拟,光照计算,是耗性能的过程。

镜面光照

镜面反射是指光线在平滑表面上的反射,使得反射光线与入射光线在同一平面内,并且入射角等于反射角。
镜面反射通常发生在光线从一个介质进入另一个折射率较小(折射率指介质对光的折射程度)的介质时,比如从空气进入玻璃或水中时。
在这里插入图片描述

菲涅尔效应

菲涅尔效应描述了光线从一个介质进入另一个介质时,由于折射率的不同而产生的反射现象。
菲涅尔效应的主要表现是入射光线部分反射和部分折射,即一部分光线通过介质界面进入另一个介质,另一部分光线则反射回原介质。

下图一个由近到远的过程,可以看到近处的石头清晰,远处的石头看不清,因为在远处的石头,几乎不发生折射。
在这里插入图片描述

菲涅尔效应的强度取决于入射角、介质的折射率差异以及极化状态等因素。

由于光照过程的复杂性,我们一般不会将完整的菲涅耳方程用于实时渲染,而是采用石里克近似
Schlick approximation)法
来代替:
R F ( θ i ) = R F ( 0 ○ ) + ( 1 − R F ( 0 ○ ) ) ( 1 − c o s θ i ) 5 R_F(θ_i) = R_F(0^○) +(1-R_F(0^○))(1-cosθ_i)^5 RF(θi)=RF(0)+1RF(0)(1cosθi)5
R F R_F RF是反射光量, 1 − R F ( 0 ○ ) 1-R_F(0^○) 1RF(0)是折射光量, R F R_F RF的值是一个RGB的向量,即颜色反应了反射光量。
下面是场景的一些材质对应的属性值:

介质 R F ( 0 ○ ) R_F(0^○) RF(0)
(0.02,0.02,0.02)
玻璃(0.08,0.08,0.08)
塑料(0.05,0.05,0.05)
(1.0,0.71,0.29)
(0.95,0.93,0.88)
(0.95,0.64,0.54)

表面粗糙度

真实世界的反射物体表面不是理想镜面,而是在微观下具有一定的粗糙度。理想转态下的镜面粗糙度是0,它的宏观与微观的法向方向是相同的,但是真实世界下不是。
在这里插入图片描述
我们定义归一化分布函数 ρ ( θ h ) ∈ [ 0 , 1 ] \rho(θ_h)∈[0,1] ρ(θh)[01],用来表示微观表面法线h与宏观表面法线n之间夹角为 θ h θ_h θh
函数公式:
ρ ( θ h ) = c o s m ( θ h ) = c o s m ( n ⋅ h ) \rho(θ_h)=cos^m(θ_h)=cos^m(n·h) ρ(θh)=cosm(θh)=cosm(nh)

在这里插入图片描述
我们将 ρ ( θ h ) \rho(θ_h) ρ(θh)与某种归一化因子进行融合,从而获得基于粗糙度来模拟镜面反射光量的新函数:
S ( θ h ) = m + 8 8 c o s m ( θ h ) = m + 8 8 ( n ⋅ h ) m S(θ_h) = \frac{ m+8}{8}cos^m(θ_h) \\ = \frac{ m+8}{8}(n·h)^m S(θh)=8m+8cosm(θh)=8m+8(nh)m
经过菲涅尔效应计算,镜面反射进入观察者眼的光量为:

C s = m a x ( L ⋅ n , 0 ) ⋅ B L ⊙ R F ( a h ) m + 8 8 ( n ⋅ h ) m C_s=max(L·n,0)·B_L⊙R_F(a_h)\frac{ m+8}{8}(n·h)^m Cs=max(Ln,0)BLRF(ah)8m+8(nh)m
可以发现,如果 L ⋅ n ⩽ 0 L·n\leqslant0 Ln0那么所计算的结果是射向表面另一侧的光,因此此时正表面不会接收到任何光照。
在这里插入图片描述

光照模型

光照模型,是根据光学的有关定律,模拟自然界中光照明的物理过程的计算机模型。
我们所看到的光照,就是各种光的叠加,比如环境光,漫反射光、镜面反射光的叠加,在数学公式上,就这些公式的加法运算。
C o l o r = c a + c d + c s = A L ⊙ m d + m a x ( L ⋅ n , 0 ) ⋅ ( B L ⊙ m d ) + m a x ( L ⋅ n , 0 ) ⋅ B L ⊙ R F m + 8 8 ( n ⋅ h ) m = A L ⊙ m d + m a x ( L ⋅ n , 0 ) ⋅ B L ⊙ ( m d + R F ( a h ) m + 8 8 ( n ⋅ h ) m Color = c_a+c_d + c_s\\ = A_L⊙m_d +max(L·n,0) ·(B_L⊙m_d) + max(L·n,0)·B_L⊙R_F\frac{ m+8}{8}(n·h)^m \\ = A_L⊙m_d +max(L·n,0) ·B_L⊙(m_d +R_F(a_h)\frac{ m+8}{8}(n·h)^m Color=ca+cd+cs=ALmd+max(Ln0)(BLmd)+max(Ln,0)BLRF8m+8(nh)m=ALmd+max(Ln0)BL(md+RF(ah)8m+8(nh)m
L L L:指同光源的光同量。
n n n:表面法线。
h h h:列于光向量与观察向量(由表面点指向观察点的单位向量)之间的中间向量。
A L A_L AL:表示入射的环境光量。
B L B_L BL:表示入射的直射光量。
m d m_d md:指示根据表面漫反射率而反射的入射光量。
L ⋅ n L·n Ln:朗伯余弦定律。
a h a_h ah:中间向量 h h h与光向量 L L L之间的夹角。
R F ( a h ) R_F(a_h) RF(ah):根据菲涅耳效应,关于中间向量 h h h所反射到观察者眼中的光量。
m:控制表面的粗糙度。
( n ⋅ h ) m (n·h)^m (nh)m:指定法线h与宏观表面法线n之间夹角为B,的所有微平面片段。
\frac{ m+8}{8}:在镜面反射过程中,为模拟能量守恒所采用的归一化因子。

平行光源

平行光源(parallel light)也称方向光源(directional light,也译作定向光源),是一种距离目标物体
极远的光源(每个入射角与照射位置行成的夹角值近似)。因此,我们就可以将这种光源发出的所有入射光看作是彼此平行的光线。(如下图)
在这里插入图片描述

点光源

类似于一个灯泡,向四面八方照射。对于任意一点 P P P,光源 Q Q Q所发出的光源总有一束会经过词典,我们定义光向量与传播方向相反,即光向量的方向是由 P P P指向 Q Q Q
L = Q − P ∣ ∣ Q − P ∣ ∣ L=\frac{Q-P}{||Q-P||} L=∣∣QP∣∣QP
在这里插入图片描述

衰减

光强会随着距离的反比例平方而发生衰减,计算公式如下:
I ( d ) = I 0 d 2 I(d)= \frac{I_0}{d^{2}} I(d)=d2I0
I 0 I_0 I0为距离光源d=1处的光强

聚光灯

在这里插入图片描述
聚光灯在大于max angle的时候,点就不在灯的照射范围内了

与点光源计算一致,它的光向量:
L = Q − P ∣ ∣ Q − P ∣ ∣ L=\frac{Q-P}{||Q-P||} L=∣∣QP∣∣QP
聚光灯范围内的所有光线强度也不尽相同,位于Light到Center上的是最强的,也就是最中心的线,其他向量会随着距离中心线的角度变大而变小,而随着角度增加至max angle,光强将逐渐趋近于0。
具体计算与之前类似, k s p o t k_{spot} kspot表示聚光灯因子
k s p o t ( θ ) = m a x ( c o s θ , 0 ) x = m a x ( − L ⋅ d , 0 ) k_{spot}(\theta)=max(cos\theta,0)^x =max(-L·d,0) kspot(θ)=max(cosθ,0)x=max(Ld,0)

  • 28
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值