目录
笔记目录:
LE7--渲染系统4:渲染管线,后处理:https://blog.csdn.net/m0_56399931/article/details/124790469
LE6--渲染系统3:游戏中的地形/天空/云渲染:Games104笔记---LE6--渲染系统3:游戏中的地形/天空/云渲染_This is MX的博客-CSDN博客
LE5--渲染系统2:光照、材质、Shadow:Games104笔记---LE5--渲染系统2:光照、材质、Shadow_This is MX的博客-CSDN博客
LE4--渲染系统1:渲染基础:Games104笔记---LE4--渲染系统1:渲染基础_This is MX的博客-CSDN博客_渲染系统
LE3--基础架构2:数据组织与管理:Games104笔记---LE3--基础架构2:数据组织与管理_This is MX的博客-CSDN博客
LE2--基础架构1:引擎架构分层整体Pipeline:Games104笔记---LE2--基础架构1:引擎架构分层整体Pipeline_This is MX的博客-CSDN博客
LE1--现代游戏引擎导论:Games104笔记---LE1--现代游戏引擎导论_This is MX的博客-CSDN博客
环境光遮蔽:
我的理解是AO,表示正半球上有多少部分能够看到,实际上就是计算渲染方程中的可见性函数
SSAO:
他的流程是:
①获取到场景的深度图
②在一个着色点的(正)半球随机散布采样点,如果采样点的深度比深度图中的深度更大(更远离相机),那这个点就应该加入ao值中
③所有的采样点ao值取平均
HBAO:
他的流程是:
①将其周围360的角度进行均分,每个方向分别做RayMarching
②RayMarching之后可以得到一个以为的高度场(就一个角度,如下图中h(θ)的θ)
③根据点P和它的法线N,计算出它的切面角(也是一个角度,如下图中t(θ)的θ)
④根据前面求出的角度,我们可以求出当前方向的环境遮蔽值
HBAO在实现的时候可能出现的问题:Low-Tessellation 、不连续、噪声等,这个里放个链接可以去看:HBAO(屏幕空间的环境光遮蔽) - 知乎
HBAO有个问题,没考虑不同方向光的贡献度不同
GTAO:
GTAO的流程如下:
①求出每个slice的 horizon angle
②根据angle求slice的 visibility ( 注意根据法线做Cosine Weight)
③根据经验公式做Mult Bounce ( 下图第二张)
RTAO:
实时的光追肯定不能一个像素开高spp,每个像素的spp会分布在时序上
雾效:
深度雾:
高度雾:
体素雾:
我们会对相机空间进行体素切分,我们存储结构尽量和屏幕保持一致
体素雾的实现可以去看论文,也可以看知乎大神的文章:体渲染探秘(二)基于VoxelVolume实现体积雾 - 知乎
抗锯齿:
SSAA和MSAA:
SSAA:每个像素进行多倍的采样并进行着色,但是这种方法消耗太大了
MSAA:每个像素进行多倍的采样并跟更加每个采样点是否有一个不在三角形内,如果有那这个点也进行多倍着色,否则只进行一次着色
FXAA:
基于1x渲染图像的抗锯齿
根据亮度找到边缘像素
计算每个边缘像素的偏移量
重新采样边缘像素的偏移量与邻居混合
我们可用使用sobel 算子求出边缘
TAA:
Motion Vector:场景和相机的视角都有可能会发生变动,这就导致某一个像素点在上一帧中并不在当前这个屏幕坐标上。为了获取动态物体的某一个像素在上一帧的对应屏幕空间坐标,我们还需要记录其上一帧的MVP矩阵,来进行重投影(Reprojection)。这样得到的两次屏幕坐标的位移记录下来,我们称之为Motion Vector 或者 Velocity。
TAA的实现:TAA原理及OpenGL实现 - 知乎
后处理:
Bloom(泛光):
Bloom的实现原理:我们首先根据一个阅值提取出图像中的较亮区域,把它们存储在一张渲染纹理中,再利用高斯模糊对这张渲染纹理进行模糊处理,模拟光线扩散的效果,最后再将其和原图像进行混合,得到最终的效果。
然后高斯模糊中使用一个高斯核进行卷积计算,这个二维高斯核采样次数过高,但是我们能够进行将其拆分成两个一维高斯核来进行卷积计算
Toon Mapping:
色调映射功能的目的是将宽范围的高动态范围(HDR)颜色映射到显示器可以输出的标准动态范围(SDR)
Color Grading:
color grading的核心思想就是颜色映射,根据当前颜色映射到另外的颜色,稍微详细点的可以看结尾的作业解析
渲染管线:
前向渲染:
一个个人渲染物体
但是前向渲染不适合计算大量光源的场景
延迟渲染:
延迟渲染的流程:
第一个流程会先把几何信息放到GBuffer中
第二个流程就几何信息进行光照运算
延迟渲染在计算光照的时候,需要注意的是每个光源创建一个包围盒来算他对于pixel的贡献,这样计算才能正确获得光照加速
延迟渲染优缺点:
优点
①光照只计算可见的片段
②来自G-Buffer的数据可以用于后处理
缺点
①高内存和带宽成本
②不支持透明对象
③对MSAA不友好
TBR:
对于TBR来讲,整个光栅化和像素处理会被分为一个个Tile进行处理,通常为16×16大小的Tile。TBR的结构通过On-Chip Buffers来储存Tiling后的Depth Buffer和Color buffer。
文章推荐:针对移动端TBDR架构GPU特性的渲染优化-腾讯游戏学堂
Forward+:
Cluster Based Rendering:
文章推荐:Cluster Based Deferred Lighting(1) - 知乎
Visibility Buffer:
挑战
复杂的并行工作需要与复杂的资源依赖性同步
大量生命周期小于一帧的瞬态资源
复杂资源状态管理
不需要大量的用户低级知识,就可以利用新暴露的GPU特性
渲染到屏幕:
作业2:
作业2
你应该……
实现ColorGrading着色器代码
生成自己风格的配色结果
添加您想要的新后处理过程(高级)
写一个包含结果截图的报告文档
作业解析:
普通项:
这一个部分主要做fragshader的修改,我就不粘代码了,大家可以去手写一下
我们可以分析一下这个lut图(关注01-06,因为格式一样)
基本思路:他是十六块(假定资产规格都是这样),我们以color.b来采样块数,color.r为块内uv.u偏移,color.g为块内uv.v偏移。
需要注意:
①我们需要对块数采样做双线性插值。
②uv.u偏移需要按照块数做除法,采样块数需要从原本uv的0-1映射到0到块数减一。
提高项:
加一个pass,这个问题其实有点难,如果没学过vulkan,而且学过其实也不太好讲
主要就是根据原本的color_grading.cpp,复制出一个相同的subpass.cpp
然后在render_pass.cpp进行initialize
在main_camera.cpp的updateAfterFramebufferRecreate()进行draw
并且需要在render_pass.cpp的setupRenderPass中对自己的subpass进行初始化,
①设置VkAttachmentReference,②设置VkSubpassDependency--这里只要是设置前一个subpass,和目标输出到的subpass,③设置VkSubpassDescription--这里主要是设置pInputAttachments和pColorAttachments(注意因为前面toon_mapping和color_grading的pInputAttachments/pColorAttachments是交换使用的,如果我们的subpass放在color_grading之后那我们的subpass也能够用color_grading的attachment)
注意改完之后要记得改对应的下一个subpass的变量
然后是描述符池desriptor_pool.cpp,这个可以照着自己的subpass.cpp中相关descriptor Layout 的数量对描述符池中的VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER和VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT进行修改