GAMES104-游戏中的渲染管线、后处理和其他的一切

Ambient Occlusion,AO 环境光遮挡
对于表面上每个点,部分才能看到光,部分被其他的几何遮挡住了看不到光

根据光影的明暗变化,构建空间立体感

实现方式(简单版本)
Precomputed AO,预计算
烘焙到 occlusion map
只能用于静态物体

Screen Spcae Ambient Occlusion(SSAO)
思想:每个像素点的深度构成一个 height field
每一个采样点比较 ZBuffer ,看是否会被挡住 (Screen-Based)
但是有问题,只需要采样沿着法线的半球面了
升级版 SSAO+

Horizon-based Ambient Occlusion(HBAO)
沿着一个点四周转,找到超过邻居几何的最高处
得到这个夹角,最后得到一个半球高高低低的覆盖图
缺点:
光越靠近天顶,射出来的强度是100%的吸收;如果是斜45射出来的强度不一样
少考虑了一个参数

Ground Truth-based Ambient Occlusion(GTAO)
符合真正离线算法中的结果
如果能算出来 AO 值是多少,最后可以得出来 Multi Bounce 是多少
(根据大量数据得到出关联度)

Ray-Tracing Ambient Occlusion,(RTAO)
现代 GPU 可以快速做 Raycast 的计算,算出来和其他方向到底有没有遮挡


Fog,雾(气溶胶)

Depth Fog:设置起始点和终点,慢慢的模糊(最简单)
Linear fog
Exp fog
Exp Squared fog
缺点:雾是有一定物理效果的,越贴地面越有

Height Fog
当高度低于X时,所有的 Fog 都是这个强度;大于X时,会按指数递减

Voxel-based Volumetric Fog,体素化 Fog
根据视锥进行切分,距离眼睛远近切分不均匀的,再进行 Ray-Marching 计算


Anti-aliasing,走样 抗锯齿
游戏引擎最后是一个像素一个像素的对真实世界进行采样
采样率总会不够的

常见问题
Edge Sampling:几何的边不是横平竖直,屏幕像素一定会造成一个一个的效果的
Texture Sampling:表面 Texture 有很多细节,不同角度有很多摩尔纹(通过MiniMap可以解决)
Specular Sampling:高频高光

如何解决这个问题?
核心思想:
多采样几次,对变化的值进行平均。就会产生很多过渡区域,连起来看就比较光滑(不是明确的01变化)
(Scene 矢量精度无限大=》Game 固定像素)

Super-Sample AA(SSAA)
把需要绘制的尺寸x2,4x rendering resolution,肯定会生效
但是,ZBuffer,FrameBuffer 都会付出额外四倍的代价

Multi-sample AA(MSAA)
对空间还是4倍采样
每个像素分4个点,如果都被采样到了就采样一次;如果有部分没被采样到,就多次采样按照权重分配
现代硬件已经支持了,只需打开一个开关即可

现代技术如何解决这个问题?
FXAA(Fast Approximate Anti-aliasing)
不用扩充空间
a.用图形学算法,把图片中的 Edge 取出来,只对这些进行混合算法
如何找边?十字型滤波,每个像素点找到上下左右像素点的差异值,综合差异值大于某个阈值
b.区分竖向还是横向差异更大,再比较某一个方向的谁和谁的差距大
c.依次找周围颜色变化差不多的点,直到颜色变化差异特别大的点(找到边的两个端点),比较两端的长度,看受哪边影响更大
现在显卡也集成了这个算法,速度很快

TAA(Temporal AA)
不用扩充空间
对游戏中某个像素保存很多帧,取平均帧进行混合


后处理,Post-process
Bloom:光晕
Tone Mapping:曝光
Color Grading:调色
还有其他很多…

Bloom Effect
霓虹灯,强光源
Airy dist,主要是散射

1.如何做 Bloom?
a.渲染出整个画面后,转换到整个的亮度,当超过某个阈值时,就认为需要 Bloom
Y = 0.2126 * R + 0.1751 * G + 0.0722 * B
b.Gaussian Blur,高斯模糊
此时的模糊是不够大的,
c.Pyramid Gussian Blur
最低一阶做高斯模糊,然后每一阶叠加回来(运算量会小很多)

2.如何做 Tone Mapping?
要么就是亮度过量,要么就是暗度过暗
所以需要调色
通过一些曲线把 一些HDR 颜色通过曲线映射回 0-1 的值
Filmic Curve
ACES(Academy Color Encoding System)

3.如何做 Color Grading?
本质上就是 LUT
原始颜色和想调的颜色 做成一个 LUT 3D Texture
(256256256。一般就存小的,中间做差值)
输入一个颜色,输出一个颜色
Photoshop 有工具 可以新建图层自动导出 Color Lookup Tables


渲染管线(Rendering Pieline)
定义一套规则,保证谁先谁后,有顺序的

简单的 Pieline:
Forward Rendering:ShadowPass -> Shading -> Post-process
透明物体需要最后绘制
透明排序 Transparent Order:先绘制离相机远的,再绘制离相机近的

有问题:
现代游戏场景,光非常复杂

Deferred Rendering:
先把所有的物体渲染一遍,但是不去算和光的关系
Albedo Specular Normals Depth => G-Buffer
再只计算在某个像素的所有光的影响
优点:
复杂光支持很快
更支持后处理
缺点:
把所有的材质信息写到一个 GBuffer 里面,硬件读写数据很慢
移动端更明显,读写发热快

Tile-based Rendering:
一小块一块的渲染,单独存储 frameBuffer
Light Culling,Light List
Depth Range Optimization
渲染之前会生成 early z 深度,直到最远的z 和最近的z 在哪里

Forward+ Rendering(Tile-based Forward)

Cluster-base Render
直接对视锥进行进行划分

Visibity Buffer:
存几何信息,反向找到材质
现代游戏几何比渲染复杂,老方法会浪费

困难:
1.不同的游戏渲染的效果不一样
2.每个算法除了计算还需要占用额外的存储资源
3.GPU 借口越来越抽象,自己需要定制化开发,有门槛

Frame Graph
(Unity 中 SRP)
通过图形化,表示出渲染资源的先后关系


Render Motion
VSync:画面上下错开
引擎一直在渲染,但是渲染的帧数是不一致的。显示器刷新的时间是一致的,造成等的情况
VSync 要等所有的 FrameBuffer 写完再刷新

硬件支持
Variable Refresh Rate:动态设置刷新帧率

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值