渲染管线中光照的计算

文章目录

  • 渲染管线中光照的计算
    • 前言
    • 法向量
    • 朗伯余弦定律
    • 漫反射
    • 环境光照
    • 镜面光照
      • 菲涅尔效应
    • 表面粗糙度
    • 光照模型
    • 平行光源
    • 点光源
      • 衰减
    • 聚光灯

渲染管线中光照的计算

前言

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

无光:
在这里插入图片描述
有光
在这里插入图片描述
很明显的感知就是无光下渲染的模型,给人的感受是扁平化,不像一个模型,但是在经过光照渲染之后,就可以感受出立体效果。光照下的模型经过光照(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)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/608015.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《ESP8266通信指南》14-连接WIFI(基于Lua)

往期 《ESP8266通信指南》13-Lua 简单入门(打印数据)-CSDN博客 《ESP8266通信指南》12-Lua 固件烧录-CSDN博客 《ESP8266通信指南》11-Lua开发环境配置-CSDN博客 《ESP8266通信指南》10-MQTT通信(Arduino开发)-CSDN博客 《ES…

【api接口开通教程】YouTube Data API v3申请流程

一、背景调查 1.1 API接口介绍 采集youtube数据,大体分为两种方案:一种是基于爬虫,一种是基于API接口。 说人话就是:爬虫相当于走后门、爬窗户(利用技术手段窃取,人家没说给,但我硬拿&#x…

Python - 金三银四心路历程 之 数据结构与算法 刷题

目录 一.引言 二.心路历程 三.刷题经历 四.刷题历程 五.总结 一.引言 <夜深人静写算法> 是 23 年 12 月底博主打算跳槽时开始做刷题准备做的专栏&#xff0c;前后准备了大约一个月&#xff0c;刷题完毕后简单准备了项目和简历后就开始加入找工作大军了&#xff0c;最…

如何在电脑中截屏【攻略】

如何在电脑中截屏【攻略】 前言版权推荐如何在电脑中截屏电脑工具截屏键&#xff1a;PrtScQQ截屏快捷键&#xff1a;CtrlAltA微信截屏快捷键&#xff1a;AltAQQ浏览器截屏快捷键&#xff1a;CtrlShiftXEdge浏览器截屏快捷键&#xff1a;CtrlShiftS 最后 前言 2024-5-9 21:31:3…

MongoDB Atlas Vector Search与Amazon Bedrock集成已全面可用

亮点前瞻 ●MongoDB Atlas Vector Search知识库与Amazon Bedrock的最新集成&#xff0c;将极大加速生成式AI应用的开发。 ●诺和诺德利用MongoDB Atlas Vector Search与Amazon Bedrock集成&#xff0c;加速构建AI应用程序。 MongoDB&#xff08;纳斯达克股票代码&#xff1a…

scikit-learn实现单因子线性回归模型

1.是什么&#xff1a; 针对机器学习提供了数据预处理&#xff0c;分类&#xff0c;回归等常见算法的框架 2.基于scikit-learn求解线性回归的问题&#xff1a; 2.1.求解a&#xff0c;b对新数据进行预测&#xff1a; 2.2评估模型表现&#xff08;y和y’的方差MSE&#xff09;…

Linux流量分析工具 | nethogs

在应急过程中&#xff0c;经常会遇到应用访问缓慢&#xff0c;网络阻塞的情况&#xff0c;分析原因可能会想到存在恶意程序把带宽占满的可能。通过这样一个小工具可以快速定位异常占用带宽程序的路径、PID、占用流量大小或是排除由带宽占满导致服务器缓慢的猜想。 一、简介 Ne…

【ai早报-01 project】

今天和大家分享一款有趣的开源项目 01 Project。 The 01 Project is building an open-source ecosystem for AI devices. 其主旨是基于开源生态&#xff0c;构建以LLM为核心的产品&#xff0c;提供软硬件方案。 市面上类似产品: Rabbit R1, Humane Pin。 如上图所示的这款产…

保姆级零基础微调大模型(LLaMa-Factory,多卡版)

此处非常感谢https://github.com/hiyouga/LLaMA-Factory这个项目。 看到网上的教程很多都是教如何用webui来微调的,这里出一期命令行多卡微调教程~ 1. 模型准备 模型下载比较方便的方法: 1. modelscope社区(首选,速度很高,并且很多需要申请的模型都有)注意要选择代码…

MySQL加减间隔时间函数DATE_ADD和DATE_SUB的详解

目录 前言语法示例代码运用 前言 mysql中内置函数date_add 和 date_sub能对指定的时间进行增加或减少一个指定的时间间隔&#xff0c;返回的是一个日期。 语法 添加时间间隔 DATE_ADD(date,INTERVAL expr type)SELECT DATE_add(NOW(),INTERVAL -7 DAY);//获取7天前的日期 S…

编译和链接(超详细)

✅博客主页:爆打维c-CSDN博客​​​​​​ &#x1f43e; &#x1f539;分享c语言知识及代码 一、编译和链接实例 假设我们有一个名为main.c的C语言源文件&#xff0c;它包含了一个简单的Hello World程序。我们可以使用gcc编译器对该源文件进行编译&#xff0c;生成一个可执行…

初学者必知:ARM与单片机的区别

在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「ARM的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;ARM和单片机之间有许多区别&#…

锂电池恒流恒压CCCV充电模型MATLAB仿真

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; CCCV简介 CCCV充电过程是恒流充电&#xff08;CC&#xff09;和恒压充电&#xff08;CV&#xff09;的结合。在CC阶段对电池施加恒定电流&#xff0c;以获得更快的充电速度&#xff0c;此时电池电压持续升高…

python爬取sci论文等一系列网站---通用教程超详细教程

环境准备 确保安装了Python以及requests和BeautifulSoup库。 pip install requests beautifulsoup4确定爬取目标 选择一个含有SCI论文的网站&#xff0c;了解该网站的内容布局和数据结构。 &#xff08;1&#xff09;在浏览器中访问目标网站&#xff0c;右键点击页面并选择…

免费开源低代码平台种草推荐

从业20载&#xff0c;从当初的兴奋&#xff0c;到最后的麻木&#xff0c;甚至怀疑&#xff1a; 程序员是不是就是在不断的学习各种技术&#xff0c; 然后做着同样的重复劳动&#xff08;体力劳动&#xff09;&#xff0c;在各种业务系统上用各种技术做同样的增删改查。 对的&am…

每日两题 / 104. 二叉树的最大深度 102. 二叉树的层序遍历(LeetCode热题100)

104. 二叉树的最大深度 - 力扣&#xff08;LeetCode&#xff09; 递归判断&#xff0c;当前节点的最大深度为1 max(左节点的最大深度&#xff0c;右节点的最大深度) /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* …

C++ 函数重载

两个以上的函数&#xff0c;具有相同的函数名&#xff0c;但是形参的个数或者类型不同&#xff0c;编译器会根据实参的类型机个数的最佳来自动调用哪一个函数。 一 带默认形参值的函数 在定义函数时预先声明默认的形参值。调用时如果给出实参&#xff0c;则用实参初始化形…

为什么需要归档和管理合同

归档和管理合同是非常重要的&#xff0c;主要有以下几个原因&#xff1a; 1. 法律合规性&#xff1a;公司需要遵守法律和监管要求&#xff0c;合同是法律文件&#xff0c;涉及公司的权益和责任。归档和管理合同可以确保公司遵守法律法规&#xff0c;合同的内容和执行过程都符合…

《大数据分析-数据仓库项目实战》学习笔记

目录 基本概念 数据仓库 数据仓库整体技术架构 数据仓库主题 数据集市 数据仓库的血缘关系 数据仓库元数据管理 数据仓库的指标 数据仓库维度概念 HDFS Flume Hadoop Kafka 数据仓库分层模型 Superset 即席查询 Sqoop Atlas元数据管理 项目需求描述 系统目标…

AlibabaCloud微服务下的链路追踪系统实战详解

&#x1f680; 作者 &#xff1a;“二当家-小D” &#x1f680; 博主简介&#xff1a;⭐前荔枝FM架构师、阿里资深工程师||曾任职于阿里巴巴担任多个项目负责人&#xff0c;8年开发架构经验&#xff0c;精通java,擅长分布式高并发架构,自动化压力测试&#xff0c;微服务容器化k…
最新文章