Spherical Harmonics(球谐函数)与PRT

关于求解系数Ci

投影:由于一个函数 f(w) 可以由一系列基函数和系数的线性组合表示,那么怎么确定基函数前面的系数,这就需要通过投影操作:

函数F(X)通过对应的基函数B(i)进行投影操作,从而求出各基函数对应的系数Ci,与以下操作是同一个道理,在空间中想描述一个向量,可以xyz三个坐标来表达,把xyz轴当做三个基函数,把向量投影到xyz轴上,得到三个系数就是三个坐标。

重建:知道基函数对应的系数,就能用系数和基函数恢复原来的函数。

由于基函数的阶可以是无限个的,越高的阶可恢复的细节就越好,但一方面是因为更多的系数会带来更大的存储压力、计算压力,而一般描述变化比较平滑的环境漫反射部分,用3阶SH就足够了;另一方面则是因为SH的物理含义不是特别好理解,高阶SH容易出现各种花式Artifact

球谐函数的性质

正交性: 能够较简单地投影/重建、simple rotation。

旋转是一个很重要的性质:旋转一个基函数之后,得到的函数就不再是一个基函数(因为基函数有严格的朝向等限制),但是旋转球谐函数等价于同阶基函数的线性组合。

积分之后的频率取决于积分前最低的频率

对于任意的product integral(两个函数先乘积在积分),我们将其认为是做了一个卷积操作,理解为spatial域上的两个信号f(x)和g(x)进行一个卷积,等于在频域上让两个信号相乘,如果两个信号有一个信号是低频的,那么频域上相乘后得到的结果也是低频的,最终相乘在积分的结果也是低频的,可以总结为:积分之后的频率取决于积分前最低的频率,即the frequency of the integral is the lowest of any individual’s。

diffuse BRDF的shading

根据积分之后的频率取决于积分前最低的频率,由于漫反射的BRDF是低频的,所以高频的光照 * 低频的diffuse仍然是低频,所以光照用相对低阶的球谐函数就可以重建很高的效果

背景

在实时渲染中,我们把rendering equation写成由三部分组成的积分:

所以利用基函数的基本原理把一些东西先预计算出来,从而节省开销.

PRT

参考:Games202 高质量实时渲染笔记lecture 06 Real-Time Environment Mapping 02 - 知乎 (zhihu.com)

欲解决问的问题

1.将shadow考虑进去

2.我们仍然用基函数思路去考虑任何的brdf.

思路

把rendering equation分为两部分,lighting 和 light transport.

假设在渲染时场景中只有lighting项会发生变化(旋转,更换光照等),由于lighting是一个球面函数,因此可以用基函数来表示,在预计算阶段计算出lighting.

而light transport(visibility和brdf)是不变的,因此相当于对任一shading point来说,light transport项固定的,可以认为是shading point自己的性质,light transport总体来说还是一个球面函数,因此也可以写成基函数形式,是可以预计算出的.

PRT的Diffuse
总过程:
拆分过程

由于在diffuse情况下,brdf几乎是一个常数,因此我们把brdf提到外面.

由于lighting项可以写成基函数的形式,因此我们求和式把其代入积分中,对于任何一个积分来说,在Bi的限制下,li此对积分来说是常数,可以提出来.

对于积分中的部分来说,Bi是基函数,v和cos项在一起不就是light transport吗,那不就是light transport乘与一个基函数,这就成了lighting transport投影到一个基函数的系数,接下来代入就能进行预计算,这样就只要算一个点乘就好了。

拆分过程2
  1. 直接把渲染方程中的lighting和light transport,都用sh基函数表示

然后把两个都展开成求和,然后把求和符号拆出去,然后就变成了一个双重求和的结果,每个求和要乘三样东西:

1.对应的两个系数

  1. 积分值(积分与实际场景无关,是两个基函数的product integral)

(图片转载于知乎)

如果基函数的个数为n的话,做一个向量点乘的复杂度应该是O(n),为什么在这里是双重求和变成了O( n2 )了呢?

这是因为SH具有正交性,也就是当p=q时候,Bp(wi)Bq(wi)才不为0,也就是这个二维矩阵上只有对角线上有值,因此只需要计算对角线上的值就行了,所以算法复杂度仍然是O(N)。

缺点

参考:Games202 高质量实时渲染笔记lecture 06 Real-Time Environment Mapping 02 - 知乎 (zhihu.com)

1.light transport做了预计算,因此visibility当了常量,因此场景不能动,因此只能对静止物体进行计算.

2.对于预计算的光源我们把它投影到sh上,如果光源发生了旋转,那不就相当于换了个光源吗?

针对2:由于sh函数的旋转不变性可以完美的解决.

旋转光照 = 旋转SH的基函数 任何一个SH基函数旋转后都可以被同阶的SH基函数线性组合表示出来

PRT的Glossy

Diffuse和glossy的区别在于,diffuse的brdf是一个常数,而glossy的brdf是一个4维的brdf(2维的输入方向 I ,2维的输出方向 O).

如果仍然按照上面的办法投影到sh上会出现一些问题,因为light transport包含visibility和brdf,brdf又是一个4维的函数(关于i和o的函数),给一个O就会有一个不同的brdf,给定一个任意的观察方向O,light transport都会投影出一组完全不同的VECTOR,且vector中的每一个元素都是一个o的函数.

或者直观一点来说,glossy物体有一个很重要的性质,它是和视点有关的.diffuse的物体不管视角如何旋转改变,你看到的Shading point的result是不会改变的,因为整个Diffuse shading和视角是无关的.

总过程

拆分过程

glossy是和视角有关的,不同的视角得到的shading result也是不一样的,因此O不一样,L(O)也不一样.所以即使light transport即使投影到了i方向上的基函数,所得到的仍然是一个关于O的函数而不是系数.

我们将4D的函数投影在2D上之后,虽然得到的是一个关于O的函数,但是现在这个函数也只是关于O了,因此我们在O的方向上将其投影到SH基函数上.

因此,light transport上就不再认为得到的是向量了,而是一个矩阵,也就是对于任意一个O都会得到一串VECTOR,最后把所有不同O得到的VECTOR摆在一起,自然而然就形成了一个矩阵.

或者这样理解,我们最后得到的是不同方向上的radiance,自然而然是一个向量,我们将lighting投影到SH上得到的是一个向量,只有向量 * 矩阵 得到的结果才是向量,因此这里只能是矩阵.

可想而知,这样的话将会产生巨大的存储.

缺点

Diffuse 物体:每个点需要两个长度为16的向量点乘;(diffuse情况下一般三阶就足够了)

Glossy 物体:每个点需要16阶向量与16*16矩阵乘。(一般需要高阶一点)

当Glossy非常高频的时候,也就是接近镜面反射的情况的时候, PRT就没有那么好用,我们虽然可以采用更高阶的SH来描述高频信息,但是使用SH甚至远不如直接采样方便。

Reference:

Games202 高质量实时渲染笔记lecture 06 Real-Time Environment Mapping 02 - 知乎 (zhihu.com)

Lecture6 Real-time Environment Mapping_哔哩哔哩_bilibili

Games202 高质量实时渲染笔记lecture 05 Real-Time Environment Mapping - 知乎 (zhihu.com)

GAMES_101_202_Homework/Homework_202/Assignment2 at main · DrFlower/GAMES_101_202_Homework · GitHub

(55条消息) GAMES 202 作业2_冬眠的关刀的博客-CSDN博客_games202作业2

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值