跳转到主要内容
Computer Graphics Jun 21, 2022 2 tags

07.渲染管线、后处理和其他一切

07.渲染管线、后处理和其他一切

cover

环境光遮蔽AO

图示

图示

数学原理:对表面每一个点在其可看见的正半球面只有部分能看见天光,其余的被物体遮挡

图示

通过Ray Tracing在建模软件内离线计算到贴图中;空间换时间。

缺点:计算昂贵;只能用于静态模型

屏幕空间环境光遮蔽(SSAO)

图示

思想:从相机发射射线寻找交点,在交点处以一个半径均匀撒点,再用相机去投射采样点就能获得深度信息,再拿这个深度信息和Z-buffer比较,如果深度更小,说明该采样点能看见光;如果深度更大,说明该采样点就被挡住了。

缺点:环境光的计算应该是半球面,均匀撒点就会有50%的概率撒在错误的一半。

SSAO+

图示

HBAO

图示

思想:通过Ray Marching光线检测判断光线所能接收到的最大的仰角范围,就能得到有多少面积的天顶是可见的,有多少面积的天顶是被遮挡的。再加入一个衰减方程,如果距离太远,就对AO没什么变化。

图示

缺点:如果一个面朝向正上方,那么从天顶射来的光和侧面射来的光明显应该有所区别。

真实情况环境光遮蔽GTAO

图示

思想:GTAO引入了cos函数,删除了衰减函数,并且增加了多次反弹。

图示

图示

思想:通过强大的GPU能实时发射射线检测可见性。


雾效

图示

图示

图示

思想:当高度低于设定值时,雾效的值都是最大的那个;当高度高于设定值时,雾效的值就是一个指数递减的值。

体素雾效

图示

思想:根据摄像机视锥体,离近平面越近切分越密。然后在视锥体内再运用Ray Marching等算法实现(与算大气效果类似)。


抗锯齿

图示

图示

图片走样的原因:真实世界的采样率是无限的,而屏幕的分辨率是有限的。

图示

思想:我们知道频幕上像素的采样是不充分的,所以我们就多采样几次,把采样的值再平均。

超采样(SSAA)&多采样(MSAA)

图示

SSAA:把所有尺寸double一下再降频为最终的结果。缺点:付出了4x的计算代价。

锯齿产生最多的地方在几何的边缘,超采样中的大部分点其实不需要超采样,因为很多点都在几何的内部,真正有问题的是那些只占据一小部分的像素。

MSAA:虽然对空间依然是4x的采样,但做shading的时候,如果这四个像素都落在同一个像素上,那就只shaing一次。如果不在一个像素上,那就都shading好,再根据占据比例算一个平均值。

快速近似抗锯齿(FXAA)

图示

想法:提取图片的edge,只在edge的地方用插值的方法。对一个像素点采样它上下左右的像素做平均,如果大于某个阈值,那么就标记为边界。阈值怎么获得:把图片转化为亮度空间在对上下左右比较色差。

图示

图示

图示

图示

图示

时序抗锯齿TAA

图示

思想:这一帧的计算用前一帧的数据,在时间轴上找数据

图示

图示

TAA缺点:看见On/Off之间有偏移了吗?因为TAA是和上一帧做的blend,所以会有一些offset,做不好时也会出现一些残影。


后处理Post-process

光晕Bloom

光晕的物理基础:现实世界的透镜永远不可能完美聚焦;即使是完美的透镜也会产生光圈。

如何做光晕

金字塔高斯模糊

曝光

现代游戏都会制作HDR的内容,但是许多用户没有支持HDR的硬件,所以要通过一个曝光曲线来控制让SDR的色彩显示HDR的色彩。

优势:可以经过在pipeline后端的调整统一HDR/SDR的颜色显示;对美术团队的干扰很小。

调色

LUT可以将原有颜色的数据映射到一个新的颜色;可以理解为一种应用于图像或镜头的预设。


渲染管线

这么多的算法必须要有一套规则制定顺序,谁先谁后。

前向渲染Foward Rendering

透明的物质一定是在不透明物质之后渲染,并且要规定不透明物质的排序;首先绘制离相机选的,再绘制近的。

缺点:现代游戏场景光极其复杂

延迟渲染 Deferred Rendering

思想:把所有的物体先渲染一遍,但先不计算和光的关系,把Albedo、Specular、Normal、Depth等先存在G-Buffer中,这样模型就可以先单独算光的部分了。

优势:计算高度一致;照明只计算可见光;G-Buffer数据可用于后处理。

缺点:计算很费内存和带宽;不支持半透明物体;对MSAA抗锯齿不友好。

Tile-based Rendering

思想:把画面切成一小块一小块里的,只把一小块的结果存在FrameBuffer里,而不需要一个巨大的G-Buffer,减少读写的压力。

优势:可以得到光照在多少Tiles内计算,减少不需要的计算范围,得以更加高效。

Forward+(Tile-based Forward) Rendering

Cluster-based Rendering 集群渲染

遍历每个Tiles对光线的可见性进行计算

最新的技术 Visibility Buffer

之前讲述的延迟渲染的本质上是把大量的材质信息写到G-Buffer中;随着现代硬件的发展,已经可以把几何信息和材质信息剥离开来。在一个FrameBuffer中存储像素属于哪个几何体ID,可以反向去查某个三角面应该用什么材质;就能在后续过程中直接进行Shading。

曾经在游戏中普遍认为材质很复杂,而现如今几何的复杂程度很可能超过材质。

在G-Buffer中制作Shading时去查TextureSampler的效率非常低,现在在Visibility Buffer取到值之后直接去查VB和ID,效率极高。

G-Buffer中存储的是材质的全属性;Visibility Buffer中存的是几何的全属性。不需要的材质类型都去除掉了。


Frame Graph

真实的算法管线

脚本渲染管线Scriptable Render Pipeline(SRP)

思想:把pipeline中的东西变成一个个模块,把计算和资源的依赖用一个有向无环图Directed Acyclic Graph(DAG)表达出来


V-sync & G-sync

V-sync

原因:GPU帧率有时候是不稳定的,但显示器帧率是一致的。

思路:G-Buffer必须全部渲染完才输出到屏幕。

Related Articles

继续阅读