GAMES202笔记
本文为学习GAMES202相关笔记,课程地址为:https://www.bilibili.com/video/BV1YK4y1T7yY ,感谢闫老师的精彩课程!
L1 Introduction and Overview
课程内容
-
实时高质量渲染
实时: 大于30FPS, (对于XR是90FPS)
高质量:真实,可靠(all-time correctness (exact or approximate), no tolerance to (uncontrollable) failures)
-
课程的四大部分
阴影
全局光照
基于物理的渲染
实时光线追踪
-
Evolution
通过适当的近似,生成照片级真实(photorealistic)又比离线渲染要快的图片
-
实时渲染发展的几个里程碑
可编程渲染shader(20年前)
预计算方法(15年前)
L2渲染管线
参考101相关内容
OpenGL
一系列从CPU调用GPU管线的API
跨平台
同类替代品(DirectX, Vulkan)
-
缺点
-
许多版本
-
C风格,不好用
-
(曾经)难以debug
-
-
Open 执行流程
可以用画油画来类比
A. 摆放物体
用户说明物体的顶点,发现,纹理坐标并把他们送到GPU的Vertex buffer object(VBO)
Model 变换
B.设置画架
View变换
创建frame buffer
C.把画布放到画架上
在OpenGL的每个渲染pass上, 声明要使用的framebuffer, 声明一个或是多个要输出的texture, 渲染
D.在画布上画画
使用vertex/fragment shaders来着色
-
对于每个顶点
OpenGL调用用户指定的shader: MVP和其他ops
-
对于每个primitive
OpenGL做光栅化,对每个该fragment包含的pixel生成对应的fragment
-
对于每个fragment
OpenGL调用用户指定的shader: 着色和光照计算
OpenGL还会处理z-buffer,除非被用户重写
-
OpenGL Shading Language(GLSL)
-
初始化
-
创建shader: vertex和fragment
-
编译shader
-
把shader连接到program上
-
链接program
-
使用program
-
-
Debug shader
-
NNsight Graphics (cross platform, NVIDIA GPUs only)
-
RenderDoc (cross platform, no limitations on GPUs)
-
渲染方程
RTR的渲染方程和101中的渲染方程等价,无非换了种形式
我们可以使用cube map 或者 sphere map来表示来自各个方向的incident lighting
本课之后还会引入其他的方法
-
2-pass的算法
-
image-space的算法
自遮蔽问题
走样
Shadow mapping 的数学原理
-
RTR中的一个重要近似
可以用到渲染方程里面,把V作为上式中的f提取出来
近似适用条件如下,该情况是满足的
-
When is it accurate?
-
Small support (point / directional lighting)
-
Smooth integrand (diffuse bsdf / constant radiance area lighting)
-
PCSS: Percentage closer soft shadows
一种实现软阴影的有效方法, 基于PCF和shadow mapping
单光源
PCF
对深度比较的结果(0,1的二值)在一个范围内取平均,用这个平均值作为V的结果
-
范围大小的影响
-
小范围,阴影更尖锐
-
大范围,阴影越软
-
-> 可以想到用PCF做软阴影,那么问题是正确的size怎么选?
Blocker Size
一个观察: 阴影平面距离遮挡物越远,产生的阴影越软
引入blocker size的概念,可以以此作为PCF中选择filter size的决定因素
PCSS的具体流程
-
Step 1: Blocker search (getting the average blocker depth in a certain region,可以是定值,也可以动态)
-
Step 2: Penumbra estimation (use the average blocker depth to determine filter size)
-
Step 3: Percentage Closer Filtering
关于第一步中动态决定region大小,可以把shadow map放到近截面(z-near)(这个面是人为规定的),把要渲染的点和光源相连,shadowmap上截出来的区域就是对blocker depth 取平均的区域.
参考: PCF&PCSS实现软阴影——GAMES202学习笔记 - insulation的文章 - 知乎 https://zhuanlan.zhihu.com/p/359377010
PCF和PCSS的回顾
PCF回顾
滤波,卷积,加权平均在某种程度上是同一件事
PCF中,对应被滤波的原函数应该是X+(D1 - D2),如下图
而不是对shadow map(如下图)或者生成的图像的Visibility进行滤波
PCSS回顾
-
可能比较慢的步骤
在给定区域内查询每一个texel, 对应第一步(求平均blocker depth)和第三步(PCF)
VSSM(下文)就是针对PCSS这两个相对较慢的步骤进行了加速
Variance soft shadow mapping
对PCF的加速
PCSS选择一个邻域内深度比较然后再把得到的0-1值平均,等价于求出在邻域里有多少个Texel离得更近.
我们假设texel深度分布为正态分布,则容易求出某深度排多少(CDF),问题转化成求出这个正态分布,因为正态分布由均值和方差确定,即求这两个参数.
-
对于均值, 硬件会做MIPMAP,我们也可以用 Summed Area Tables (SAT) 求出,见下文
-
对于方差, Var(X) = E(X2) − E2(X), 只需要生成shadow map同时生成深度平方对应的图
在求出分布后,我们可以通过数值解/查表得知P(x>t),但是这里进行了又一个假设:
使用切比雪夫不等式进行估计
-
该不等式并不要求正态分布,只要求是单峰分布(正态的假设是满足的)
-
我们直接把不等近似成相等,注意该近似是在t>u时误差才较小的
对求blocker depth的加速
经过上面操作后,PCSS的第三步不再需要循环访问邻域的点了,然而第一步求平均blocker depth时还要访问邻域,以下是另一方面的加速
我们记Blocker (z < t)的平均深度为 Zocc
非blocker (z > t) 的平均深度为Zunocc
则容易得到以下公式:
我们希望求得Zocc
Zavg是已知的
N1/N = P (X>t) 可以用之前的切比雪夫不等式近似求出
N2/N = 1 - N1/N
Zunocc我们直接近似为t(假设更深的点深度都和该点相同), 这个相等假设有一定的合理性因为大部分阴影接受面都是平面(深度相同)
则Zocc可以求出
MIPMAP and Summed-Area Variance Shadow Maps
在VCSS中,为了求得均值,我们需要经常对一个矩形区域进行范围查询(Range Query)
MIPMAP 和 Summed Area Table (SAT)都可以用来解决类似范围查询的问题
MIPMAP在101中讲过,本处就不再赘述
SAT
基本可以认为是二维的前缀和
对于任何一个轴对齐的矩形(上图中的蓝色)区域,它可以转化为四个矩形相加减的结果,而且这四个矩形都是左上角是固定顶点的矩形,我们完全可以通过预处理求出所有左上角为矩形的左上角,右下角为(X,Y)的矩形和,然后对于任何矩形区域,查表四次即可
-
建表会有时间空间的开销,空间开销问题不大(等于原图大小),时间开销可以用并行(CUDA)加速
Moment shadow mapping
该方法是对VSSM的一次改进, VSSM中假设了正态分布,然而该假设有时会出问题,如下图,如果用红线的正态分布估计蓝线的实际分布,得到的阴影结果会更亮,这一问题被称为"Light leaking"(有些人也称light bleeding,但是为了防止与后面的color bleeding混淆而不采用该说法)
-
Moment SS核心: 用更高维的矩(moment)来得到更好的分布
-
矩的定义很有多等价说法,我们这里用最简单的x x2 x3 x4
-
VSSM其实只用了一阶和二阶矩
-
-
结论:用m阶矩可以表示一个m/2个阶梯的函数(证明略,老师说很复杂)
实际中,一般四阶矩已经足够好了,即生成shadow map时,同时记录z,z2,z3,z4
然后blocker search 和PCF中存储矩生成的CDF
-
优点,解决了light leaking的问题
-
缺点,存储,时间的花销增大
对比和总结
这三种方法都是生成软阴影的方法
VSSM对PCSS进行了加速的改进,Moment SS又对VSSM进行了改进,解决了漏光的问题,在过去一段时间VSSM和moment也有应用,但现在主要用的是噪声版本的PCSS
-
所谓噪声版本PCSS,即在邻域内不查询所有点而是采样,因此产生了噪声
-
噪声PCSS被广泛应用的前提,当前各种降噪方法非常成熟(TAA什么的)

浙公网安备 33010602011771号