Shadows
ShadowMap
硬阴影实现后存在自相交问题→ 解决方式为根据角度计算动态bias。
引发新的问题部分阴影不显示→ 学术界解决方式为记录second depth。虽然不增加时间复杂度,但是2n比n还是增加了性能损耗(if else导致的)。
近似什么时候比较准确呢? g(x) smooth即变化不大 ,比如常数,small support积分范围小的时候。
eg:shadingpoint上brdf而言diffuse就是smooth的,glossy brdf就不适合。面光源作为Li的时候也适合
Percentage Closer Filtering(PCF) ——本意用于抗锯齿
不是基于quad的后处理
不是基于DepthMap的图片处理
是对DepthMap多采样求平均用于反走样
PCSS(Percentage Closer Soft Shadows ) ——用于软阴影,有噪点可以通过等TAA去噪
PCF filter 因子比较大会使得阴影变的更软,引申出大的比如9*9的filter可以用于实现软阴影
step2:根据平均深度 及 相似三角形中light长度求得filterSize。
阴影软硬程度与 投影着色点到遮挡物的距离 有关,距离越近,filter size应该设置越小,反之越大。
Blocker本身采样的大小可以通过lightArea动态计算blocker size。
step3: fragmentShader按filterSize逐像素做采样平均。
Variance Soft Shadow Mapping(VSSM)——使用很多近似计算,性能高,无噪声
核心:对Step1 和 Step3性能优化
pcf本身是想知道已知depth值,其在shadowmap上某一区域内排第几名。所以为了提高效果,可以近似使用正态分布(或者切比雪夫直接估计)的期望mean和方差variance来预估结果。
生成shadowMap时同时生成square-depth map写入depthMap的g分量即可。如何根据一张图和区域,快速得到其均值和方差?mipmap → 如何生成用于范围查询的mipmap呢?
求得均值和方差后如何求出CDF即灰色部分面积?
遮挡物概率和被遮挡物概率可以用切比雪夫,Zunocc大胆假设其为t深度本身(是挺大胆的233),可得结果Zocc
解决方案:MipMap&&SAT(Summed Area Table) For Range Query
一维情况
二维:每个点记录其左上到右下角值的和并计算。性能:时间复杂度O(n像素数)以及存储空间。
Moment Shadow mapping 通过高次矩增加精度
对于右图,由于假设不太对导致VSSM效果不好。
MomentShadowMapping目的是:更准确的描述分布。Moment是矩,而VSSM保留了一次和二次的矩。保留m阶的矩,可以近似表示m/2 steps
特点:与vssm相似,此外需要存储z,z2,z3,z4。效果更好,但是耗费存储以及性能(重建时)
Distance Field Soft Shadows
S(Signed)DF距离函数的用处:1.距离函数用于步进式算法求交 2.用于步进式算法计算安全角,用于软阴影计算。通过对边比斜边,近似对比安全角。并设置系数K,K越大,阴影越硬。
SDF可用于计算相交或者说安全距离
k越大,阴影越硬
优缺点:好处是快(只是SDF查询快,生成慢且有存储需求)和高质量。缺点在于需要预计算SDF距离场,且如果有形变需要重新生成距离场。接缝处可能有artifact。存储量大,类似三维纹理。
其它ShaowMap方式参考:https://zhuanlan.zhihu.com/p/26853641(包括Consolution ShadowMap and Expontial Shadow Map)·*
Shading from Environment Lighting(ImageBasedLighting、4
所以可以用近似等式
蒙特卡洛积分采样大量样本,得到近似结果
The Split sum approximation
1st Stage 通过prefiltering预计算环境光贴图
将环境光贴图做filter,这样左上角积分其实可以近似于prefilter之后的光照强度。
与阴影对比,由于光照比较smallSupport或反射积分比较smooth,所以可以将光照提取出来,改为上式。
2nd Stage 右边的积分也需要预计算
大量使用预计算,但是人们无法承受高纬度的预计算
BRDF只预计算菲涅尔项和法线分布项。
自变量有3个,分别为R0(基本颜色)、入射角cos theta、Roughness。
把R0拆出来,这样就只有两个变量了-》 入射角cos theta、Roughness。
将积分结果通过Roughness和cos theta预计算得到表格(一张texture),并用于查询。
Shadow from Environment Lighting
环境光下的实时阴影实现十分困难。
如果将其看成是多光源问题,光源越多消耗越大;
如果将其看成采样问题,难度不在于采样而是visibility项未知;
RealTime environment lighting(&global illumination)
背景知识
傅里叶变换
基函数
图片频域上对应频谱显示出来
卷积其实就是一种滤波操作,对于时域做卷积,实际上是对频域上做乘积。二者可转换。
理解1:球面坐标是二维的,对应一个结果。
理解2:一维的傅里叶变换。
TIPS:为什么不把球面映射到平面上再做傅里叶变换? A: 这样可能会导致出现一条缝,即不连续的情况发生。而球面谐波可以保证连续。
根据函数f(w)以及基函数求基函数的系数ci。如果为l阶,就需要算出2 l + 1个系数。然后组合2* l + 1个系数乘上基函数相加根据theta和fi就能反算出f(w)结果。
diffuse的BRDF项低频所以3阶够了,光照项3阶也够了
Precomputed Radiance Transfer(PRT) 处理阴影和全局光照
可见性函数不应该是不同的吗?怎么办呢?PRT规定场景不变,只有光照可变。这是该方法的大问题,后面会提。
Diffuse BRDF PRT
以diffuse情况下RenderEquation计算为例
PRT存在问题:light不能旋转,可视性不能变化导致场景也不能变化
总结
正交性:相乘并积分结果为0
旋转后,基函数可以被同阶基函数组合得到
一般只需要低阶基函数就可以描述
Specular/Glossy BRDF PRT
向量乘矩阵
PRT的缺陷
更多的基函数
wavelet小波函数:在很多维度上趋近0,所以可以只记录前几个最大系数。支持全频率的表示,因此展示效果较好,但是不支持旋转。
对于cubemap,分别对6张图做小波变换。类似JPEG压缩方式。
Global Illumination
Reflective Shadow maps(RSM) --image space
visibility不好算,直接不算
好处:容易实现
问题:性能与直接光源个数成正比;没有间接光照的可见性判断;很多假设:diffuse反射物,深度作为距离等等;采样率和质量的tardeoff;
Light Propagation Volumes(LPV) --3d空间
第一步
第二步:计算并保存每个体素的光照,通过SphereHarmonics函数记录
第三步:迭代56次传播
第四步:渲染
问题:LigthLeaking -》解决方法:细粒度一点