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

一、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.mzph.cn/news/57591.shtml

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

相关文章

PCB电路板电压电流监测软件

PCB电路板电流监测软件详细设计说明书是一个详细描述软件系统设计和实现的文档,它提供了软件系统的架构、功能模块、接口设计、数据存储和处理、界面设计、数据库设计、系统测试、部署和维护计划等方面的详细信息。模拟量采集/老化房采集软件 该文档的目的是为了确保…

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

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

【从零开始学习JAVA | 第四十六篇】处理请求参数

前言: 在我们之前的学习中,我们已经基本学习完了JAVA的基础内容,从今天开始我们就逐渐进入到JAVA的时间,在这一大篇章,我们将对前后端有一个基本的认识,并要学习如何成为一名合格的后端工程师。今天我们介绍…

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

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

python web GUI框架-NiceGUI 教程(一)

python web GUI框架-NiceGUI 教程(一) streamlit可以在一些简单的场景下仍然推荐使用,但是streamlit实在不灵活,受限于它的核心机制,NiceGUI是一个灵活的web框架,可以做web网站也可以打包成独立的exe。 基…

hdfs操作

hadoop fs [generic options] [-appendToFile … ] [-cat [-ignoreCrc] …] [-checksum …] [-chgrp [-R] GROUP PATH…] [-chmod [-R] <MODE[,MODE]… | OCTALMODE> PATH…] [-chown [-R] [OWNER][:[GROUP]] PATH…] [-copyFromLocal [-f] [-p] [-l] [-d] … ] [-copyTo…

电子价签如何让电信门店数字化事半功倍?

数字化转型&#xff0c;高效的工具首先跟上。早在2020年&#xff0c;深圳电信就与云里物里开展商业合作&#xff0c;在深圳所有电信营业厅安装云里物里的ESL电子标签&#xff0c;以替代传统纸质标签的显示。经过几年的效果认证&#xff0c;云里物里的数字化智显设备得到了深圳电…

Web3.0时代什么时候到来,Web3.0有什么机会?

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;CSDN领军人物&#xff0c;全栈领域优质创作者✌&#xff0c;CSDN博客专家&#xff0c;阿里云社区专家博主&#xff0c;2023年6月CSDN上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师…

什么是亚马逊类目核心关键词?

亚马逊类目核心关键词是指在亚马逊平台上&#xff0c;与特定产品类别相关且具有较高搜索量和竞争度的关键词。这些关键词在产品标题、描述、属性和搜索关键字等位置使用&#xff0c;有助于提高产品的曝光度和搜索排名&#xff0c;并吸引潜在买家的注意。选择适当的核心关键词可…

Flink Kubernates Native - 入门

创建 namespace [rootCentOSA flink-1.17.1]# kubectl create ns flink-native [rootCentOSA flink-1.17.1]# kubectl config set-context --current --namespaceflink-native命令空间添加资源限制 [rootCentOSA flink-1.17.1]# vim namespace-ResourceQuota.yamlapiVersion:…

IDEA的maven想显示层级关系,而非平级

新版和旧版的IDEA的位置不一样&#xff0c;2023.2.1的版本在右上角的“” 这个位置 如图所示&#xff1a; 然后点击按模块分组&#xff1a;

在项目中快速搭建机器学习的流程

在软件开发领域&#xff0c;机器学习框架发挥着关键作用&#xff0c;为开发人员提供强大的人工智能工具、库和算法&#xff0c;以有效地利用机器学习的潜力。从本质上讲&#xff0c;机器学习使计算机能够从数据中学习并做出预测或决策&#xff0c;而无需明确编程。 机器学习框…

腾讯云服务器配置CPU内存怎么选?带宽多大合适?

腾讯云服务器配置如何选择&#xff1f;CPU内存、带宽和系统盘怎么选择合适&#xff1f;个人用户可以选择轻量应用服务器&#xff0c;企业用户可以选择云服务器CVM&#xff0c;2核2G3M带宽轻量服务器95元一年、2核4G5M服务器168元一年&#xff0c;企业用户可以选择标准型S5云服务…

Java 大厂面试 —— 常见集合篇 List HashMap 红黑树

23Java面试专题 八股文面试全套真题&#xff08;含大厂高频面试真题&#xff09;多线程_软工菜鸡的博客-CSDN博客 常见集合篇-01-集合面试题-课程介绍 02-算法复杂度分析 2 List相关面试题 2.1 数组 2.1.1 数组概述 数组&#xff08;Array&#xff09;是一种用连续的内存空…

Visual Studio中Linux开发头文件intellisense问题的解决办法

文章目录 前言个人环境 SSH到WSL复制文件后记 前言 最近在用我心爱的Visual Studio配合WSL2做一些Linux开发&#xff0c;但是有一个问题&#xff0c;就是当我#include <sys/socket.h>&#xff0c;会提示找不到文件 我尝试了各种姿势&#xff0c;包括修改CMakeSettings.…

与面试官互动:建立积极的技术讨论氛围

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

在 AWS 中导入 qcow2 镜像

文章目录 在 AWS 中导入 qcow2 镜像使用的格式和问题步骤概述前提条件转换镜像格式并上传至 S3创建角色并配置策略策略文件内容创建container.json配置文件导入镜像创建 AMI 并启动实例参考:在 AWS 中导入 qcow2 镜像 当我们在多云环境中部署应用时,有时候可能需要把基于 qem…

C语言学习笔记(完整版)

文章目录 算法算法的基本概念算法的特征算法的优劣 描述算法三种基本结构流程图N-S流程图伪代码 常量和变量了解数据类型常量整形常量实型常量字符型常量转义字符符号常量 变量整形变量实型变量字符型变量 表达式与运算符赋值运算符和赋值表达式变量赋初值强制类型转换 算术运算…

Spring Boot(Vue3+ElementPlus+Axios+MyBatisPlus+Spring Boot 前后端分离)【六】

&#x1f600;前言 本篇博文是关于Spring Boot(Vue3ElementPlusAxiosMyBatisPlusSpring Boot 前后端分离)【六】&#xff0c;希望你能够喜欢 &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文章…

无人机甚高频无线电中继通讯U-ATC118

简介 甚高频无线电中继通讯系统使用经过适航认证的机载电台连接数字网络传输模块&#xff0c;通过网络远程控制无缝实现无人机操作员与塔台直接语音通话。无人机操作员可以从地面控制站远程操作机载电台进行频率切换、静噪开关、PTT按钮&#xff0c;电台虚拟面板与真实面板布局…