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年前)

Interactive(指FPS很低) 光追(8到10年前)

 

 

 

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

本课之后还会引入其他的方法

 

L3Shadow Mapping 回顾

  • 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)

MIPMAPSummed 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什么的)

 

posted @ 2021-11-22 22:22  shanexyan  阅读(434)  评论(0)    收藏  举报