【GAMES202】Real-Time Environment Mapping2—实时环境光照2

news2025/1/20 21:59:31

一、Shadow from Environment Lighting

上篇我们说了给定Environment,如何计算一个着色点的Shading,但没说Shadow。而事实上,实时渲染中很难做到环境光的Shadow。

原因也很容易想到,一种观点我们把环境光当成多光源问题,如果这样,我们就要为每一个虚拟光源都生成一张阴影图,那自然不可能实现。其次是采样观点,但显然我们要采样整个半球,也就是说积分线非常长,而且显然环境光不一定是Smooth的,也就是说我们无法把环境光的Visibility从渲染方程里用之前的split sum方法拆分出来。

工业界解决多光源的方法通常是只渲染最重要的光源的阴影,或者几个相对来说重要的光源的阴影,如Unity中的前向渲染。

一些可能的解决方案,如实时光线追踪,以及我们这篇要说的 Precomputerd radiance transfer。

二、数学和信号知识回顾

1.傅里叶变换

任何一个函数都可以分解成许多不同频率的cos函数和sin函数的线性组合,这就是傅里叶变换告诉我们的,相信大家都很了解这个概念,我就不做赘述了。

2.滤波

在GAMES101里我们还介绍了滤波的概念,包括低通滤波,高通滤波,如上图就是一张图片经过低通滤波后的结果,它把高频部分都给抹除了。

3.卷积

其次我们还提到了卷积操作,其实也就是滤波操作,我们通常理解为加权平均操作,模糊操作。而时域上的卷积等于频域上的乘积,如上图。

而这里,我们可以认为,两个函数相乘再做积分就是一个卷积/滤波操作。而所谓低频和我们前面提到的smooth是一个概念,也就是变化没那么剧烈。而这个积分结果的频率由两个函数中各自的最低频决定。

4.Basis Functions—基函数

基函数,顾名思义,基础的函数。如上图公式所示,f(x)由一系列的Bi(x)函数的线性组合构成,那么Bi自然就是f(x)的基函数。自然而然,傅里叶级数展开也是一套基函数。多项式自然也是基函数。

三、Real-Time Environment Lighting (&global illumination)

1.Spherical Harmonics (SH)—球谐函数

球谐函数—Spherical Harmonics,简称SH,是一系列的二维基函数,并且每个基函数都是定义在球面上的。此处二维怎么理解呢?球谐函数的二维基函数实际上定义了三维空间中的一个方向,很容易理解,我们知道两个参数θΦ就可以表示三维空间中的一个方向。

并且可以看到,第l阶基函数的数量=2l+1,编号 - l。并且前n阶的基函数数量n的平方

也就是说SH就是一系列的基函数,有不同的阶数,各阶有不同的频率,阶数越高描述的频率越高,基函数也越多。(并且实际上每个基函数是用Legendre多项式写出来的)

其次这里涉及到一个投影的操作,什么是投影呢?给定任何一个球面函数,如果我们想把它展开成某阶的一系列球谐函数的基函数,那么其中某个基函数的系数ci是多少呢,事实上ci就等于把这个函数f和这个基函数做乘积再积分(product integral)得到的结果,这就是投影—Projection操作。这里和一个我们熟知的操作类似,假设我们三维空间有一个向量,我们需要用(x,y,z)坐标表示它,那么xyz的值各是多少呢?那自然就是这个三维向量在各个坐标轴上的投影喽。显然球谐函数的各个基函数就可以理解为三维空间的各个坐标轴,而想要表示的函数自然就是那个三维空间的向量。

其次,三维空间中我们的投影用的不是点乘吗?为什么这里的投影变成了乘积的积分(product integral)呢?事实上,乘积再积分的操作本质上就是点乘,也就是dot操作。其次我们想三维空间的三个坐标轴互相投影为0,也就是说它们是正交的/互相垂直的,而事实上球谐函数的各个基函数也互相垂直

那么l是不是可以等于无限呢? 事实上并不是,人们通常用前有限阶的一系列球谐函数来近似还原想要的某一个球面函数。比如用前4阶,那只需写16项,而更高阶高频的项则选择丢掉。

关于球谐函数的更多解释和理解,可以参考两篇文章,这里不做赘述:

大二学生都会的球谐函数 - 知乎 (zhihu.com)球谐函数介绍(Spherical Harmonics) - 知乎 (zhihu.com)

2.球谐光照近似的Diffuse 

DiffuseBRDFsmooth的,这点我们之前提到过,也就是说,Diffuse的BRDF是低频的,那我们求Environment的Shading的时候,要把BRDF和环境光的函数相乘然后半球积分,这正是我们之前提到的乘积再积分(product integral)的操作。那么此时,因为BRDF是低频的,我们可以把BRDF看作一个低通滤波器,低通滤波?那当我们把它投影到球谐函数的时候,如上图,可以看到只需要0,1,2阶就足够了,因为从图中可以看到之后的阶数,它们的所属系数基本接近0,因为Diffuse的BRDF是低频的,所以根本没有高阶基函数描述的高频信息。

回到我们前面的product integral操作上,我们说过,乘积再积分的结果的频率取决于低频部分,由也就是说,即使外界环境光再复杂,遇到了Diffuse的BRDF,物体的表面也不会呈现出很复杂的杠光照,这也符合我们的常识。

由上面我们知道,既然BRDF可以用前三阶的SH函数很好的近似出来,为什么我们不能把光照也用有限阶的SH描述出来呢?于是经过实验得到了如上图所示,用前3阶的SH描述光照得到的结果和正确的结果基本一致,误差接近1%。一个更通用的结论,对于任何的一个光照条件,只要BRDF是Diffuse的,我们都可以用前3阶的SH来描述光照来照亮Diffuse的物体。

3.Precomputed Radiance Transfer (PRT) — 预计算辐射传输

我们重新分析一下渲染方程,它包括Lighting项,Visibility项,BRDF项,它们三个都可以表示为一个球面函数,或者说一张Cubemap,那最终结果的颜色(带着Shadow)自然就是它们三项的对应值/像素相乘了,但显然这是一个非常麻烦的步骤,它要耗费很多时间。

PRT的思想是,我们先假设场景中只有Lighting项可以变,如光照类型/反向,其它条件都不变。这样渲染方程就被我们拆成了两部分,一项我们叫Lighting,另一项我们叫它light transport。其次,在预计算的时候,PRT把Lighting项拆成了一系列SH基函数。又因为我们前面提到,场景中除了光照其他条件都不变,那么显然light transport项也不会发生变化,它相当于着色点自身的性质,既然light transport不变,那我们就可以在渲染之前把它预计算好。

其次我们之前说过了因为场景中除了光照其他条件都没有变,所以light transport项里的Visibility项,BRDF项,甚至cos项,都是球面函数,它们相乘后的结果仍然是球面函数,那我们自然可以把light transport项也用SH基函数表示。

 (1)Diffuse情况

在这篇文章中,我们从Diffuse的情况来看,因为Diffuse的情况相对来说比较简单。首先因为Diffuse的BRDF是一个常数(我们之前提到过只不过当时把它写作了kd漫反射系数),所以我们可以把它从积分中提出,这里我们写作ρ。其次用我们前面提到的球谐函数可以把Li项用一系列基函数表示变成求和项。然后交换积分与求和的顺序(图形学中大多数情况都可以调换积分和求和的顺序),此时基函数的系数li也可以从积分中提出。此时我们可以看到右边划红线的部分变成了,Visibility项和cos项的乘积也就是light transport项,再乘一个基函数然后积分,这不就是Light transport项在SH各个基函数上的投影吗。

显然,上图划红线的部分直接可以预计算得到,最后组成一个表格存储计算的结果。于是最终的形式就如图所示,变成了L(o)  ρ Σ li·Ti,也就是一个点乘,就可以计算出Diffuse下的环境光照并且带有Shadow。

当然,我们前面提到,我们只假设了光源可以改变,其它场景条件不变,那么Visibilty项如果不能变得话,计算着色点周围的遮挡关系就不能改变。

其次因为光源也做了预计算,如果要更换光源,我们要对不同的想要使用的光源都进行预计算。那么如果光源可以旋转呢?这里可以用球谐函数的一个很好的可以旋转的性质解决。

(2)球谐函数的性质

● 正交性,任何两个基函数互相垂直,在对方上的投影为0  (eg. B1·B2=0)

● 可以把任何函数投影到SH上,只需做product integral操作即可

●SH某个基函数发生旋转,这个旋转后了的基函数可以由同阶的其它基函数线性组合表示

若由SH表示的球面函数发生旋转,可由SH发生旋转来表示,只不过各基函数的系数会随之改变。就我们上面提到的光源旋转问题而言,用SH我们可以立刻得到旋转之后的光源投影在各个基函数上的系数是多少。

这里我更倾向与二维坐标系的理解,我们前面说过基函数和坐标系的坐标轴可以类比,那如果一个二维向量在二维坐标系旋转了,我们自然可以通过旋转坐标系来达到和旋转向量一样的效果。

球谐函数全面讲解 - 知乎 (zhihu.com)

可以看到,基函数的阶数越高,拟合出的光照效果越接近真实光照。

(3)小结 

到这里我们就把Diffuse的PRT流程介绍完了,简单的说就是通过球谐函数的投影和求和积分顺序的交换,最后把渲染方程改写成了一个两个向量的点乘,左边是光照被投影在各个基函数上的系数,也就是光照值 ,右边则是预计算的light transport项。

可以看到,Diffuse的PRT最终在环境光照下得到的结果很好,并且带有Shadow。(最右边Shadow+Inter表示多次的light bounce的light transport项预计算后得到的结果)

至于PRT如何处理非Diffuse情况,我们下一篇介绍。


参考:

GAMES202_Lecture_06 (ucsb.edu)

Lecture6 Real-time Environment Mapping_哔哩哔哩_bilibili

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软件测试实训系统建设方案

一 、系统概述 软件测试实训系统是软件开发过程中的一项重要测试活动,旨在验证不同软件模块或组件之间的集成与交互是否正常。综合测试确保各个模块按照设计要求正确地协同工作,以实现整个软件系统的功能和性能。以下是软件测试实训系统的一般流程和步骤…

2023腾讯云服务器多少钱一年?CPU内存带宽配置报价

腾讯云服务器租用价格表:轻量应用服务器2核2G4M带宽112元一年,540元三年、2核4G5M带宽218元一年,2核4G5M带宽756元三年、云服务器CVM S5实例2核2G配置280.8元一年、GPU服务器GN10Xp实例145元7天,腾讯云服务器网长期更新腾讯云轻量…

格式化u盘怎么做?分享几个简单方法!

“u盘用了好久,存储了很多不太重要的文件,想将它格式化之后继续使用。但是不知道怎样才能格式化u盘,大家有什么好的建议吗?” U盘是常见的移动存储设备,然而,在日常生活中使用u盘时,我们可能因为…

锁策略、原子编程CAS 和 synchronized 优化过程

前言 锁冲突:两个线程获取一把锁,一个线程阻塞等待,一个线程加锁成功。 目录 前言 一、锁策略 (一)乐观锁和悲观锁 (二)重量级锁和轻量级锁 (三)自旋锁和挂起等待…

HTML基础1

一、创建项目和标签基础 1.1 什么是HTML 英文全称Hyper Text Markup Language, 中文全称为超文本标记语言。 超文本标记语言是标准通用标记语言下的一个应用,也是一种规范,一种标准,它通过标记符号来标记要显示的网页中的各个部…

进程与线程(概念、并行、并发)

进程与线程 一、定位二、什么是进程?三、进程管理1、PCB相关属性(了解)2、多任务的处理方式 四、什么是线程?总结 一、定位 在计算机系统中,操作系统是其中的重要一环。对上,给软件提供稳定的运行环境&…

ssm+vue线上体验馆管理系统源码和论文

ssmvue线上体验馆管理系统源码和论文085 开发工具:idea 数据库mysql5.7 数据库链接工具:navcat,小海豚等 技术:ssm 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储&#xff0…

el-collapse折叠面板默认全部展开/关闭

所要展开项的name标识符与v-model绑定值匹配即可默认展开。 1. 案例 <el-collapse v-model"activeNames"><el-collapse-item name"0" title段落1>那一年&#xff0c;花开得不是最好&#xff0c;可是还好&#xff0c;我遇到你&#xff1b;&l…

高忆管理:A股已具备年度配置价值

周末利好四箭齐发&#xff0c;财政部、证监会、三大买卖所均宣布严重方针调整&#xff0c;首要包含印花税调降、IPO节奏阶段性收紧、融资保证金比例降至80%、限制大股东和实控人减持等。二级商场上&#xff0c;大盘大幅高开后一路震动走低&#xff0c;终究收盘涨幅显着收窄。业…

ROS通信机制之服务(Service)的应用

1、服务的概述 在上节我们讲过一个重要通信机制话题&#xff1a;ROS通信机制之话题(Topics)的发布与订阅以及自定义消息的实现&#xff0c;这里介绍另外一种节点之间传递数据的方法&#xff1a;服务(Service)服务的本质是同步的跨进程函数调用&#xff0c;也就是说节点可以调用…

骨传导耳机哪款比较好,市面上最好的骨传导耳机分享

随着科技的日新月异&#xff0c;骨传导耳机也在不断更新换代。市场上涌现出许多品牌&#xff0c;这使得消费者在购买时感到困惑。别担心&#xff01;我们为你整理了一些市场上最好的骨传导耳机品牌&#xff0c;希望能帮到你。现在&#xff0c;就让我们一起探索这些骨传导耳机的…

人工智能会成为人类的威胁吗?马斯克、扎克伯格、比尔·盖茨出席

根据消息人士透露&#xff0c;此次人工智能洞察论坛将是一次历史性的聚会&#xff0c;吸引了来自科技界的许多重量级人物。与会者们将共同探讨人工智能在科技行业和社会发展中的巨大潜力以及可能带来的挑战。 埃隆马斯克&#xff0c;特斯拉和SpaceX的首席执行官&#xff0c;一直…

ssm+vue理发店会员管理系统源码和论文

ssmvue理发店会员管理系统源码和论文089 开发工具&#xff1a;idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 技术&#xff1a;ssm 摘 要 网络技术和计算机技术发展至今&#xff0c;已经拥有了深厚的理论基础&#xff0c;并在现实中进行了充分运用&a…

《高性能Linux网络编程核心技术揭秘》已出版

#好书推荐##好书奇遇季#《高性能Linux网络编程核心技术揭秘》&#xff0c;京东当当天猫都有发售。定价109元&#xff0c;网店打折销售更便宜。本书配套示例项目源码、作者QQ答疑。 本书详解高性能Linux网络编程的核心技术及DPDK框架&#xff0c;剖析Nginx高性能服务器架构&…

《PyTorch 2.0深度学习从零开始学》已出版

#好书推荐##好书奇遇季#《PyTorch 2.0深度学习从零开始学》&#xff0c;京东当当天猫都有发售。定价69元&#xff0c;网店打折销售更便宜。本书配套示例项目源码、PPT课件。 本书以通俗易懂的方式介绍PyTorch深度学习基础理论&#xff0c;并以项目实战的形式详细介绍PyTorch框…

无涯教程-Android - 应用组件

应用程序组件是Android应用程序的基本组成部分&#xff0c;这些组件需要在应用程序清单文件 AndroidManifest.xml 注册&#xff0c;该文件描述了应用程序的每个组件以及它们如何交互。 Android应用程序可以使用以下四个主要组件- Sr.NoComponents & 描述1 Activities 它们…

基于JAVA SpringBoot和HTML婴幼儿商品商城设计

摘要 随着网络技术的发展与普遍,人们的生活发生了日新月异的变化,特别是计算机的应用已经普及到经济和社会的各个领域.为了让消费者网上购物过程变得简单,方便,安全,快捷,网上商城购物成了一种新型而热门的购物方式。网上商城在商品销售的发展中占据了重要的地位,已成为商家展示…

Python直接变快五倍?最新的优化解释器和内存管理

来自公众号&#xff1a;OSC开源社区 2020 年秋&#xff0c;CPython 核心开发者 Mark Shannon 提出了关于 Python 的几个性能改进&#xff0c;这个提议被称为 “香农计划” (Shannon Plan)。 Shannon 随后创建了 Faster Cpython 项目&#xff0c;他希望在 4 年的时间里&#xff…

Boost开发指南-4.11config

config config库主要是提供给Boost库开发者&#xff08;而不是库用户&#xff09;使用&#xff0c;它将程序的编译配置分解为三个正交的部分&#xff1a;平台、编译器和标准库&#xff0c;帮助他们解决特定平台特定编译器的兼容问题。 一般来说&#xff0c;config库不应该被库…

《Flink学习笔记》——第二章 Flink的安装和启动、以及应用开发和提交

​ 介绍Flink的安装、启动以及如何进行Flink程序的开发&#xff0c;如何运行部署Flink程序等 2.1 Flink的安装和启动 本地安装指的是单机模式 0、前期准备 java8或者java11&#xff08;官方推荐11&#xff09;下载Flink安装包 https://flink.apache.org/zh/downloads/hadoop&a…