GAMES104:07游戏中渲染管线、后处理和其他的一切-学习笔记

news2024/9/20 14:53:22

文章目录

  • 前言
  • 一,Ambient Occlusion环境光遮蔽
    • 1.1 Precomputed AO
    • 1.2 Screen Space Ambient Occlusion(SSAO)
    • 1.3 Horizon-based Ambient Occlusion(HBAO)
    • 1.4 Ground Truth-based Ambient Occlusion(GTAO)
    • 1.5 Rat-Tracing Ambient Occlusion
  • 二,雾效
    • 2.1 Depth Fog
    • 2.2 Height Fog
    • 2.3 Voxel-besed Volumetric Fog体素化雾效
  • 三,Aliasing抗锯齿
    • 3.1 超采样方法SSAA、MSAA
    • 3.2 Fast Approximate Anti-aliasing(FXAA)
    • 3.3 Temporal Anti-aliasing(TAA)
  • 四,后处理
    • 4.1 bloom
    • 4.2 Tone Mapping
      • 4.2.1 Filmic s-curve tone-mapping
      • 4.2.1 ACES
    • 4.3 Color Grading
  • 五,Rendering Pipeline渲染管线
      • Tile-Based Rendering(Forward+)
      • cluster based rendeing
      • Visibility Buffer
      • 挑战
  • 六,Frame Graph/Render Graph
  • 七,Render to Monitor:V-sync、G-sync
  • QA


前言

  • 老师课前寄语:

很多同学表示课程算法两太大听不懂,老师表示games104定位是一个通识课,因为20节课不可能讲清楚游戏引擎的全部内容,因此本门课程的核心是:帮助大家建立主流方法概念和知识体系,公式看不懂也没关系,重要的是思想,以便于未来举一反三。(比如老师上学时读论文,可能一天只能读一个算法都读不懂,但如果有人能提前指出这篇论文的核心点是123的话,读论文就能效率很多,本门课程就起到一个知识总结的作用)

一,Ambient Occlusion环境光遮蔽

1.1 Precomputed AO

烘焙的AO贴图,直接加到渲染光照里:开销很小,但是效果固定(静态)不自然
在这里插入图片描述

1.2 Screen Space Ambient Occlusion(SSAO)

利用深度图,在视角空间下的模型表面的给定半径中随机采样N个点,筛选其中深度比Zbuffer更近的点作为可见点,用可见点比例近似为ao,可见性 A ( p ) = 1 − O c c l u s i o n N A(p) = 1 - \frac{Occlusion}{N} A(p)=1NOcclusion

在这里插入图片描述
问题:正常受光面是半球面,按照半径采样肯定至少有一半采样点在不可见的地方,因此不合理

  • 所以有了SSAO+:只采样半球面,修复了上边说的逻辑不合理问题。

在这里插入图片描述

1.3 Horizon-based Ambient Occlusion(HBAO)

使用深度图作为heightfield图得到周围立体高度,在用ray-marching思想向周围探索最大仰角,将天顶可见范围作为可见性。同时增加attenuation function: m a x ( 0 , 1 − r ( θ ) R ) max(0,1-\frac{r(θ)}{R}) max(0,1Rr(θ))利用设置的距离R来截断影响系数,减少远处的影响。

这里实现的时候有一些巧思,mark一下
在这里插入图片描述

问题:来自四面八方不同角度的光的贡献值实际上是不一样的,类似pbr的F项,天顶来的光和侧边来的光反射强度不同,因此计算有错误

1.4 Ground Truth-based Ambient Occlusion(GTAO)

加入了cosine factor,去掉了attenuation function,加入了多bounce的快速近似。
在这里插入图片描述
怎么近似多bounce的呢:根据不同的ao值对大量数据进行分析,将多bounce结果与ao值的曲线拟合为一个3阶多项式方程,其中ρ是albedo,Vd是单次ao,因此GTAO的结果是有颜色的

在这里插入图片描述

1.5 Rat-Tracing Ambient Occlusion

(RTX)从屏幕每个像素casting rays去看其有没有遮挡,使用RTT硬件和TAA思路加速,远处1spp(sample per-pixel),近处细节2-4spp。是未来发展方向,值得关注

在这里插入图片描述

二,雾效

2.1 Depth Fog

简单有效常用,三种模式,很多引擎内置比如unity
在这里插入图片描述

2.2 Height Fog

但真实的雾是气溶胶,是与高度相关的,比如爬山时山脚有雾山顶没有的现象。因此Height Fog假设低于某高度时fog都是最大值,但高于某高度时呈指数递减。

那么从高处看向低处的fog内的物体时,就需要积分。这里简化为对fog密度进行积分,并且是e的次方形式,可以求出解析解

在这里插入图片描述

2.3 Voxel-besed Volumetric Fog体素化雾效

在这里插入图片描述

可以实现雾气的丁达尔效果。将相机空间整体进行体素化,并且是以视锥划分的体素,可以做到近处细远处粗;计算方法与上一节计算云和多重散射的原理一样。

并且在划分体素时,体素大小应该与屏幕分辨率成比例,方便显示的连续性

三,Aliasing抗锯齿

  • 造成锯齿的三种主要原因:
    1. 几何原因,比如边的采样
    2. 纹理采样
    3. 高光采样(高频信号的低频采样)
      在这里插入图片描述

3.1 超采样方法SSAA、MSAA

SSAA全部4倍采样,MSAA先采样深度判断是否为边缘,边缘再4倍shading
问题是代价昂贵,用得少了;并且现代游戏经常三角形比像素还多,也不适用了
在这里插入图片描述

3.2 Fast Approximate Anti-aliasing(FXAA)

自己做过相关工作就简单记了:图像处理方式,通过亮度找出边缘,计算边缘offset,处理边缘像素和offset像素再blend。

效果好速度快,现代显卡一般集成了

3.3 Temporal Anti-aliasing(TAA)

具体可以去看202课程
目前游戏引擎主流算法。但是有时会出现拖曳残影等问题
在这里插入图片描述

四,后处理

老师:后处理就是一整个美颜相机

  • 后处理两类目的:
    1. 让物理更加真实正确
    2. 风格化表达

4.1 bloom

现实世界中为什么有光晕呢?有的说人眼和相机一样不能完美的聚焦到一个焦平面上,会产生一种发散;也有的说人眼晶状体是一种半透明材质,光线进入会产生散射。

在这里插入图片描述

  • 实现过程:
    1. 通过Luminance计算亮度(屏幕空间)—现在很多hdr的强度很大,有时会选择平均光场亮度计算
    2. 降采样几层
    3. 从最底层开始每一层高斯模糊后叠加至上一层----这个叠加的权重每个引擎都不一样,跟美术表现相关

4.2 Tone Mapping

比如大礼堂窗子附近非常亮,里边非常黑,这时拍照常常过亮或者过暗,这时在引擎中就需要Tone Mapping来调整曝光曲线,其实就是把HDR的图片信息映射到普通LDR的图片中,使屏幕效果更接近人眼效果,如下图

在这里插入图片描述

4.2.1 Filmic s-curve tone-mapping

能实现电影质感的曲线,用曲线拟合实现,shader如下
在这里插入图片描述

4.2.1 ACES

美国电影学院基于经验提出的曲线,优化了最终颜色被投入到各种不同显示终端的步骤(HDR和非HDR显示器、电影院等)

各个曲线对比:
在这里插入图片描述

4.3 Color Grading

就是美颜相机的LUT图调色

  • Lookup Table(LUT):记录每一个颜色remap后的颜色,相当于吧3dTex拍平成2dTex不需要很精细,中间颜色插值计算即可。

性价比超级高,游戏表现的重要环节!!!
在这里插入图片描述
在这里插入图片描述

五,Rendering Pipeline渲染管线

流水线处理流程,图程面试必考,参考别的大佬笔记的管线知识点梳理细说图形学渲染管线

  • 透明度排序:在现代游戏引擎中是非常难的事情
  • 延迟渲染高显存问题:Tile-Based Rendering(移动端)

Tile-Based Rendering(Forward+)

在这里插入图片描述

  1. 将画面分为小块进行渲染
  2. Light culling By Tiles ,因为画面分为小块,所以光照效果的渲染也可以以小块为单位,单块内只循环涉及到的光源
  3. Depth Range Optimization ,光源的渲染也考虑深度范围(距离),剔除超出光照范围的tile

移动端友好,PC也可

cluster based rendeing

在这里插入图片描述

进一步,不止屏幕分tile,视锥空间z向也分tile,分成椎体,然后分别计算对light的可见性

Visibility Buffer

上述方法都是把信息存在了Gbuffer里,但其实可以把几何信息和材质信息剥离出来,用Vbuffer保存几何信息,也可以用来反向查找对应的渲染信息。

  • 为什么要这么做呢?
  1. 现代引擎中几何密度非常高,甚至超过像素,使用Gbuffer储存会浪费大量的几何overdraw(earlyZ);
  2. 并且大量采用Gbuffer效率低,而Vbuffer及其ID效率非常高(同时自己写的光栅化比硬件光栅化效率更高)(需要dynamic indexing硬件)----没听懂啊
  3. Gbuffer种材质默认是一致的,而Vbuffer可以只保留用到的材质,并且材质更丰富

「nvidia 的Texture space shading(TSS)中有类似思路,直接在Texture上进行着色,然后再光栅化,将着色与分辨率、几何复杂度、帧率解耦—资料来自Texel Shading」
在这里插入图片描述

挑战

比如UE的引擎算法非常复杂,各个算法之间怎么work的,是一个很大的挑战:

  1. 不同模块相当于积木,应对不同的复杂项目需求要搭建不同的积木塔造型
  2. 很多计算需要消耗的buffer内存的时间远小于一帧,可能是中间值应该被释放掉的,但没有精密的内存管理时很多显存会被浪费掉,而pipeline越复杂越难以管理
  3. 新一代graphicAPI比如Vulkan和DX12,开放了硬件算力、内存管理等基础内容,这块做不对游戏会直接crash掉

六,Frame Graph/Render Graph

将管线里的模块分为不同的Frame Graph,类似于unity的SRP,然后利用一个有向无环图去去自动检测所用资源之间的相关性并自动优化

是未来的方向,但目前还不太成熟,大家还在探索。

七,Render to Monitor:V-sync、G-sync

  • Screen Tearing:屏幕更新频率是一定的,但GPU渲染频率会随着场景复杂程度变化,如果不巧刚好显示器刷新时GPU正写到一半,就会出现这种屏幕断裂的情况,这时就需要V-Sync
    在这里插入图片描述

  • V-Sync:保证每个frame buffer全部写完以后再整个刷新上去,但也会带来刷新率降低、鼠标延迟、画面时快时慢的问题。

QA

  • 开放世界的cluster怎么划分:视线锥
  • Frame Graph是高层功能还是底层功能:非常底层,绘制基础,可以理解为底层渲染语言,管理资源调用、接口等,feature是在Frame Graph之上的,但目前还在摸索。
  • TAA怎么去除鬼影:有很多Hack,比如motion vector太大或颜色差距太大就降低权重(经验值)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2049190.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java MessagePack序列化工具(适配Unity)

Java MessagePack序列化工具(适配Unity) 前言项目代码编写 结 前言 前后端统一用MessagePack,结果序列化的结果不一样,发现C#侧需要给每个类增加描述字段数量的Head,而Java却不用,所以在Java侧封装一下序列…

51系列LY-51S出现下载失败·的解法

1.他的下载电路是特殊设计的 一般连接1,2,另外的接口2,3一般不接,而且2,3的功能是用来diy自动下载电路的,你接上2,3又没独特的下载电路会一直复位

进程池详解

目录 进程池 1、什么是进程池? 2、实现进程池 (1)相关函数: pipe函数: write函数 read函数 waitpid函数 (2)代码实现面向过程进程池 Task.hpp processPool.cc 3、注意事项 进程池 …

坚鹏讲人才第12期:引领数字化未来—数字化人才与导师共赢之路

坚鹏讲人才第12期:引领数字化未来—数字化人才与导师共赢之路 ——抢占名额先机 成为坚鹏弟子 加速数字化转型 数字化浪潮汹涌而至,你是否感到迷茫、困惑、焦虑?想不想一脚油门冲进未来,和我一同探寻数字化人才的奥秘&#xf…

【迅为电子】RK3568驱动指南|第十七篇 串口-第202章 串口编程

瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码,支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU,可用于轻量级人工…

计算机毕业设计选什么题目好?基于vue的音乐播放系统

✍✍计算机毕业编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java、…

LangGraph Studio:首款智能体(agent)IDE

0 前言 LangGraph Studio 提供了一个专门的智能体IDE,用于可视化、交互和调试复杂的智能体应用程序。本文来了解如何在桌面使用。 LLM为新型智能体应用程序的发展铺平了道路——随这些应用程序演进,开发它们所需工具也必须不断改进。今天推出的 LangG…

C++(10)类语法分析(1)

C(10)之类语法分析(1) Author: Once Day Date: 2024年8月17日 一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦… 漫漫长路,有人对你微笑过嘛… 全系列文章可参考专栏: 源码分析_Once-Day的博客-CSDN博客 …

JavaFX布局-DialogPane

JavaFX布局-DialogPane 常用属性标题区域headerTextheader 内容区域contentTextcontent graphic按钮设置expandableContent 实现方式Java实现 一个特殊的布局容器,常用于弹出框,与Dialog配合一起使用包含标题区,内容区域,扩展区域…

Merkle树(Merkle Tree):高效地验证某个数据块是否包含在数据集中

目录 Merkle树(Merkle Tree) 一、基本结构 二、构建过程 三、主要作用 四、应用领域 Merkle树(Merkle Tree) Merkle树(Merkle Tree),也被称为默克尔树或Merkle哈希树,是一种基于哈希的数据结构,主要用于验证大规模数据集的完整性和一致性。它的名字来源于其发明…

【Unity教程】使用 Animation Rigging实现IK制作程序化的动画

在 Unity 开发中,为角色创建逼真且自适应的动画是提升游戏体验的关键。在本教程中,我们将结合 Animation Rigging 工具和 IK(Inverse Kinematics,反向运动学)插件来实现程序化的动画。 视频教程可以参考b战大佬的视频 …

不只是翻译,更是智慧碰撞!有道翻译与3大强敌的全方位较量

现在的科技牛得不行,翻译软件早就成了咱们学习、工作、生活里少不了的帮手。它们不光是把语言的墙给推倒了,还让咱们说话交流快多了。今儿个,咱们就一块儿瞧瞧2024年的翻译软件圈子,瞅瞅那几个最火的翻译工具,它们怎么…

生信软件30 - 快速单倍型分析工具merlin

Merlin可用于连锁分析或关联分析、IBD和亲缘关系估计、单倍型分析、错误检测和模拟。 1. merlin下载 下载地址: http://csg.sph.umich.edu/abecasis/merlin/download/ # linux版本 wget http://csg.sph.umich.edu/abecasis/merlin/download/Linux-merlin.tar.gz …

如何在本地和远程删除 Git 分支?

如何在本地和远程删除 Git 分支? 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页,我是博主英杰,211科班出身,就职于医疗科技公司,热衷分享知识,武汉城市开发者社区主理人 擅长.n…

创新赛场的制胜法宝:如何让你的商业计划书脱颖而出

创新赛场的制胜法宝:如何让你的商业计划书脱颖而出 前言明确产品或服务的核心功能突出创新性用户需求和市场痛点具体示例和场景详细描述产品和服务的方法实例化产品与服务视觉辅助工具未来展望结语 前言 作为一名资深的项目负责人,我有幸参与了无数次创新…

React + Vite项目别名配置

Node版本:v20.16.0Vite版本:5.4.1 安装 types/node 依赖包 pnpm i types/node -D pnpm ls types/node配置 vite.config.js 文件: resolve: {alias: {"": join(__dirname, "./src/"),}, },使用配置好的别名 : 由上图我们…

考试:操作系统知识(02)

进程同步和互斥 临界资源:各进程间需要以互斥方式对其进行访问的资源。 临界区:指进程中对临界资源实施操作的那段程序。本质是一段程序代码。 ◆互斥:某资源(即临界资源) 在同一时间内只能由一个任务单独使用,使用时需要加锁&…

kafka连接图形化工具(Offset Explorer和CMAK)

kafka连接图形化工具 1、Offset Explorer1.1、下载Offset Explorer1.2、安装Offset Explorer1.3、配置Offset Explorer连接kafka 2、CMAK(kafka的web管理后台)2.1、下载2.2、解压安装2.3、配置2.4、启动2.5、CMAK访问 1、Offset Explorer Offset Explor…

【数据结构】二叉树链式结构(c语言)(附源码)

🌟🌟作者主页:ephemerals__ 🌟🌟所属专栏:数据结构 目录 前言 一、节点的定义 二、创建一棵二叉树 1. 创建新节点 2. 手动创建二叉树 三、方法的声明 四、方法的实现 1. 前、中、后序遍历 1.1 前…

libLZMA库iOS18平台编译

1.下载xz源码: 使用autogen.sh生成configure文件 2.生成makefile rm -rf ./build/iOS && mkdir -p ./build/iOS && cd ./build/iOS && ../../configure --host=arm-apple-darwin64 --prefix=`pwd`/Frameworks/lzma CC="xcrun -sdk iphoneos cl…