文章目录
前言
鸽了好久。
(理直气壮)暑假就是要摸鱼啊。
lec1 课程及简介
总结陈词:闫老师APEX六杀,“怨虎龙都没打过你听什么网课”。
Lec2 回顾一些以往的知识
本节讲解知识
- 渲染管线相关知识
- opengl
- GLSL
- 渲染方程
渲染管线
- 老朋友了,具体上面的图都解释的很清楚
OPENGL
是一系列的API,在cpu端执行负责调度gpu
有几个缺点
- 版本多
- C风格的,不是面向对象语言,不好使用
- 无法debug(?)
一些好理解的opengl工作流程
- 放个模型:opengl把这个模型以VBO(Vertex buffer object)的形式存放在GPU里面,并且opengl自带有变换矩阵,直接调用就行
- 放个画架:在opengl里面建立画架(帧缓存framebuffer),并且设置摄像机位置
- 固定画布: 会有很多画布(一次render pass)在画架上
Tips:渲染完之后不直接显示在屏幕上,而是存放在缓存区,等待确定渲染完毕后,在显示在屏幕上,就是双重缓存/垂直同步
- 画在画布上:shading,课程主要会去写顶点和片元着色器。
可以多次渲染,但是前面三点不可更改。
着色语言(shading language)
历史
shading language 还是要编译成GPU语言,但是以我浅薄的代码能力,汇编语言多少是有点阅读困难的
设置shader(初始化)
phong模型的一些代码讲解:
debug shader
用RenderDoc,但是不知道能不能webgl
老师说,直接print 然后戏曲颜色,也可以debug(人脑分析式)
渲染方程
再来复习一遍吧
BRDF:双向反射分布函数,给出了入射和发射的关系
BRDF尝试给出(对于任何一个立体角上发出去的 Radiance) / (单位面积d A dAdA接收到的Irradiance)
我们收集一个面上所有获得的能量,通过反射方程获得反射到一个方向上的能量,由此得到反射方程:
渲染方程与反射方程相比,渲染方程只是多加了一个自己发光的能量。
在出现观测点之后
丢掉发光项,我们看到的像素,就是渲染方程得到结果的和可见度的结果做积。(对于求解渲染方程这一块涉及大量数学计算,已经浑浑噩噩记不清楚了,只能当做理解使用)
Homework 0
主要是来搭建一个web的环境。
语言这块不用太担心(确信
记录一下操作过程
首先在node网站下载并且安装node.js,我看新版好像用不到安装npm。
然后cmd,输入npm install http-server -g
安装好了,尝试了一下他给的过程打不开,卒 ,用vscode打开homework0框架,右击index.html打开live.server(没有安装的就在扩展里面下就行了)ok
然后就是瞳孔地震
小美人没了(悲)
重启电脑就行了。(重启电脑就是最好用的)
在重写shader前,我们先来复习一下blinnphong模型
接下来直接复制代码并且替换就行了。
Lec03 shadow mapping
本节重点:shadow mapping
简述SW
shadow mapping 是一个两趟的算法
-
第一趟,从光源可以看到的场景
-
第二趟,结合第一趟,结合摄像机看到的场景
shadow mapping是一个完全图像空间的算法
- 不用知道场景的集合信息
- 会造成自遮挡和走样的问题
关于生成最后的渲染图,用shadow map记录的z值或者是片元到光源的距离来比较都ok
SW的一些问题
- 阴影纹路不对(自遮挡问题):sw记录的深度京都不够,如右图,连线之后被遮挡,原本是光照的地方有阴影
是有一些解决方法的:
加上停止运算的小条(如下图)
but条条设置不当,会出现这个问题(我脚呢????)
在工业界也有解决这个问题(指没脚了)的方法,很多,不严谨但好用。
学术界的这个,有解决方法,但是没太多人用
存最小深度和次小深度,用中间的深度,来做SW,但是要求比较苛刻。 - 走样问题,工业界的cascaded shadow mapping等等
实时渲染不相信复杂度,我们只相信!!!速度!!!
SW背后的数学知识
在实时渲染RTR中,我们更加关心怎么近似相等
- 第一项是为了归一化
- 这种近似比较准确的情况:欧米伽很小,或者g(x)比较光滑
把渲染方程拆成了2项
左边的,Visibility部分,右边的,老朋友渲染方程了(虽然我早已忘记怎么求解了orz
他在什么时候,是准确的
- 结合上面的内容,第一种情况,点光源或者直射光;第二种情况,光照为常值
PCSS(Percentage closer soft shadows)
站在软阴影处看光源,光源部分被遮挡
为了生成软阴影,我们会使用PCF(Percentage Closer Filter)这个工具来实现。
- 他是为了抗锯齿被开发出来的
- 它在阴影判断的时候作用
它在shadowmap上和连线所交点周围的一圈像素作比较。
它平均的是,一个shading point 做的很多次阴影深度的比较的结果。
我是这么理解的,由于计算精度的问题,连线的交点不一定是完全准确的,周围01的比例决定了这个点影子的软硬程度。
取点越多,越能实现一个软影的效果。
为了更好的模拟,在不同光照下SS的效果,我们得知道以下公式
现在我们只需要得到Blocker的长度就ok了,
方法就是找到所有完全处在光照(老师这里说是阴影,但是我觉得从这张图来说是光照条件,如果有大佬浇浇这里的话就好了)下的点,记录深度,遍历所有点,取平均值。
用这个投影的方法确定到底要多少的点来遍历找blocker,找那些shadingmap 上遮挡住shading point的像素点,作为blocker
总结
Lec4 超级shadow mapping
大佬职业生涯sigraph 满20篇了,祝贺!!!
但今年已经22年了,是不是应该有新的产出了(搓手)
感触好多、、只能这条路很长,但是大佬总是在很努力的行进着。我也能有我所坚持的,所热爱的东西。希望以后会更好吧!
更深的理解PCF
- PCF就是加权平均
- PCSS,取SM的距离大于scene的点值为1,其他为0,加权平均
复习一下PCSS
- 有可能比较慢的步骤,1和3
为了解决这两个可能比较慢的问题提出了下面的新方法
VSSM(Variance Soft Shadow Mapping)
针对性解决第一步和第三步过慢的问题
对于第三步,我们需要拿到周围一圈像素的深度比较值,目的是获取:有多少texel比当前的shadingpoint要小。
问题等价类比于 一场考试中,获得班里成绩比我好的人数。
- 问题进一步简化为正态分布求积分
- 我们只需要正态分布的均值和方差
关键思想:获取filter area的均值和方差
- 均值获取:SAT(Summed Area Tables) 或者mipmap
- 方差获取:(概率论探头)
之前SW只用了一个通道存放depth 信息,现在在第二个通道内放入depth的平方信息,不会造成太大开销
- 获得正态分布,可以直接算的(概率论二度探头)
实际计算理论依据:切比雪夫不等式,假设出是成正态分布的曲线,我们不管它的实际分布到底是不是真正的正态分布也可以算(注意定义域)
总结:
- 有一定的内存开销
回到步骤1
我们要做blocker search
Zooc是遮挡物的深度值
- 主要思想就是,近似:把所有没有被遮挡点的深度都近似为该shadingpoint的深度,利用切比雪夫不等式,计算出不被遮挡点的比例,使得式子最终只剩下一个未知数,即可解出Zblocker的平均值
均值获取:SAT和mipmap
- 对于mipmap:确实,它可以做到范围查询,但是哪怕对于不是2的整数倍的正方形的计算结果都有可能不准,更何况长方形。
所以我们用SAT这个算法来范围查询
- 前六项减去前三项等于后三项的加和
- 预计算一张表,这张表上[x,y]的值是从右上角点到这个点组成的面积
- 同样的思路进行二维的范围查询
MSM(Moment Shadow Mapping)
当我们无法认为texels的depth成正态分布的时候,估计不准。
- 会发生的问题有可能变黑或者变白
- 原因五花八门:分布描述不准确,切比雪夫不等式定义域限制等等
为了避免VSSM可能会出现描述分布不准确的问题,使用更高阶的矩(moment)来描述。
- VSSM我们只是用到了一阶矩和二阶矩,提出观点,利用更多的矩来描述更加确定的分布函数。(很像泰勒展开这种)
结果
结语
翻了一下发现记的有点点乱?
下一篇会停一下,先把webgl和hw1给做了