环境光遮蔽效果 AO
AO Ambient Occlusion 环境光遮蔽
SSAO
SSAO Screen Space Ambient Occlusion
Real-time最简单的方法。目前使用的非常少。
通过分析场景中的深度值缓冲来实现环境光遮蔽效果,增强场景的深度感和真实感
具体做法:以眼睛射出的射线为基准,对屏幕上的像素进行局部采样,来估算这个物体目前被遮挡的情况。
SSAO+
SSAO+是对SSAO的增强
通过在法线导向的半球面上进行更精确的遮挡计算,提供了更高质量的环境光遮蔽效果。
适用于需要更真实阴影和细节的高质量实时渲染场景。
HBAO
HBAO Horizon-based Ambient cclusion

在屏幕空间内对每个像素点进行处理,计算该点在特定角度范围内的遮挡情况,从而生成环境光遮蔽效果
具体实施:假设AO出现在山谷里,从山谷里射出一束光,计算其仰角要多高能够让光射到山脊。
缺点:没有考虑天顶角不同(不同角度下),对光的贡献不同。
GTAO
GTAO Ground Truth-based Ambient Occlusion
通过考虑光线的入射角度和多次散射效应,提供了更真实的环境光遮蔽效果。
在屏幕空间中对每个像素的周围环境进行分析,以确定该点是否被其他物体遮挡。
雾效 Fog
Fog
Depth Fog
视线的远近来计算Fog的效果

Height Fog
fog其实是气溶胶,它实际会很容易沉淀在低处。

Voxel-based Volumetric Fog

根据视锥,根据视平面来进行切分,离你近的切的比较密,离你远的切的比较远。进行一个规则的、不均匀的切分计算。
基本就是和大气、云的方法一致。
现代fog常用的。
抗锯齿 AA
Anti-aliasing 抗锯齿(反走样)

多采样几次,将采样变化的值去取平均。
SSAA、MSAA是经典算法,目前常用的是FXAA、TAA。
SSAA
SSAA Super-sample AA(Anti-aliasing)

把图片原本要采样的尺寸变成原来的两倍,这时候整个图像就是4X倍大小。
eg:1024*798—>2048*(798*2)
MSAA
MSAA Multi-sample AA(Anti-aliasing)

三角形中间的点,实际不需要多采样。问题实际是出在边界。
做sharding,去看一个格子中的四个采样点中,如果采样点都不是同样结果的话,就对这个格子再进行处理。
问题:现代游戏的几何密度很高
FXAA
FXAA Fast Approximate Anti-aliasing

边缘是颜色的跳变,进行边缘检测。
TAA
TAA Temporal Anti-aliasing
在时间轴上找数据。

后处理
Bloom

用于模拟高亮区域的光晕扩散现象,这种效果在真实世界的摄影中也会出现。
通常用来增强图像的视觉效果,特别是在模拟明亮光源时
Airy disk 艾里圆盘:
- 光通过圆形孔径(如镜头光圈)后形成的衍射图样
- 当光线通过镜头时,由于衍射效应,焦点周围会形成一个中心亮斑,周围逐渐变暗的圆盘状图案,这就是艾里圆盘。
- 这个现象在Bloom效果中被模拟出来,以增加图像的真实感。
Tone Mapping
Tone Mapping

HDR渲染:阳光直射的地方亮度高,阴影亮度低。
原始的HDR处理,会出现色偏的现象。这时用一个Tone Mapping处理。

Filmic
顽皮狗提出的一个曝光曲线,对每个颜色数值进行新的映射。

ACES

美国电影协会提出的曲线。
优点:
- 考虑到了HDR、SDR不同显示器的颜色映射的问题。
- 考虑到了不同环境下,比如普通环境和电影院里等,颜色映射的问题。
Color Grading

Color Grading又叫Lookup Table(LUT),原始颜色和需求的效果颜色的映射。
涉及调整和优化图像的色彩平衡、对比度、饱和度和色调,以达到特定的视觉效果或情感表达
渲染系统总结
mesh材质用sharding绘制,然后还要裁剪。
shadowing、global lllumination比较难,PBR材质统一天下。
世界难以表达的地形、天空和云,通过一些积分方程等模拟这个世界。
AO表达世界凹凸有致,Fog让世界有层次感,AA让世界的效果更加平滑。接着要对时间美颜,Bloom一个光晕的效果,Tone Mapping进行正确的曝光,Color Grading魔法科技能够把整个游戏调节成
渲染管线
一个画面中,基本是几十种上百种算法在工作。需要进行管理。
Forward Rendering

直接计算场景中每个物体(网格)与每个光源的光照效果,并将结果输出到屏幕上。
最简单的Pipeline思想。
Transparenting:透明物绘制。
透明物要放在不透明物的后面来绘制。
Deferred Rendering
Deferred Rendering 延迟渲染
现代游戏光及其丰富。
处理过程:
- 把所有的东西渲染一遍,和光的关系放在最后算,先算材质,比如roughness、depth等,全部丢到一个buffer中,一般称为G-buffer。
- 这时一块一块的光到屏幕上时,就只用算光的部分,每一个像素的sharding运算只会去算一次。
好处:对光的处理非常方便
问题:Gbuffer实际上效率是非常低的,这个问题在移动端中
Tile-based Rendering
移动端对发热非常敏感,存储芯片最容易发热。
在java的层面,把画面切成一小块一小块来渲染。减少对G-buffer的读写。
Forward+ Rendering
就是用Forward Rendering,一个一个小块来渲染。
Cluster-based Rendering
将场景空间划分成多个三维的集群,每个集群对应于屏幕上的一组像素。
通过在三维空间中对光源进行裁剪,仅对那些与光源相交的集群进行光照计算,从而提高渲染效率
Visibility Buffer
现代渲染管线的发展方向,目前是作为一个辅助。
Deferred Rendering中,G-buffer中存储的材质的全属性,Visibility Buffer存的是几何的全属性,通过几何的属性可以反向查到材质。
Frame Graph
描述了在单个帧中渲染过程中各个渲染通道(passes)和资源(resources)之间的依赖关系。
unity中URP、HDRP下面用SRP定义。
显示技术
Screen Tearing
Screen Tearing 屏幕撕裂
屏幕撕裂是一种显示问题,当显示器的刷新率和GPU的帧率不同步时发生
V-Sync
V-Sync 垂直同步
用于显卡和显示器之间帧率同步的技术
目标是在保持游戏画面流畅、避免画面撕裂的同时,提供更为均匀、成熟的游戏视觉体验。
VRR
VRR Variable Refresh Rate 可变刷新率
显示器根据实时需要来动态调整刷新率的技术
可以减少或消除屏幕撕裂和图像延迟等问题,提高游戏和视频的流畅度和质量
VRR技术包括FreeSync和G-Sync。