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

文章目录

  • 前言
  • 一,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.rhkb.cn/news/402729.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring——AOP前言(写一个小demo为了好学习AOP)

1.AOP的概念 1.1 AOP简单样例 我们来先通过一个例子来对AOP进行理解,这个例子就是有关Spring的事务的一个样例,有关Spring是怎么实现事务的,这个事务其实本质上就是对于我们代码的一个增强。废话不多说,上程序,请各位…

SOAP @WebService WSDL

SOAP & WebService & WSDL SOAP(Simple Object Access Protocol)WebService(Web服务)WSDL(Web Services Description Language) SOAP(Simple Object Access Protocol) **是一…

Ciallo~(∠・ω・ )⌒☆第十七篇 Ubuntu基础使用 其一

Ubuntu是一种基于Linux的操作系统,它是开源的、免费的,并且具有广泛的用户群体。 基本文件操作:Ubuntu使用命令行工具来进行文件操作。以下是一些常用的命令: 切换到用户主目录: cd ~ 切换到上级目录: cd .…

解密键盘输入:探索设备控制器的奥秘

流程初探 键盘是我们最常用的输入硬件设备之一。作为程序员,你知道当我们敲击键盘上的字母"A"时,操作系统会发生什么吗?下面我将简要介绍整个过程,以便你更容易理解为什么需要这些组件。 首先,让我们来看看…

Linux下 vim的用法

目录 前言 一、初始Vim 二、使用Vim 1.1命令模式 2.1底行模式 3.1插入模式 前言 提示:这里可以添加本文要记录的大概内容: 本篇文章会介绍vim的基本用法和为什么我们要学习vim。 提示:以下是本篇文章正文内容,下面案例可供…

PumpkinRaising靶机

端口扫描 目录扫描 访问80端口, 在页面上面发现提到了一个Jack,可能是一个用户名 f12查看源码 找到一个页面 拼接访问 查看源码 发现一个注释 解密 是一个目录 /scripts/spy.pcap 访问,自动下载了一个文件 wireshark打开流量包 找到第一个s…

IndexError: list index out of range | 列表索引超出范围完美解决方法

IndexError: list index out of range 📉 | 列表索引超出范围完美解决方法 IndexError: list index out of range 📉 | 列表索引超出范围完美解决方法摘要 📄引言 🚀 什么是 IndexError: list index out of range?&…

vba代码插入折线图

xqwertyy52152018139hi303533312015 Sub test()Set sht1 ThisWorkbook.Worksheets("示例")x sht1.Range("I1").Lefty sht1.Range("I1").Topw sht1.Range("N15").Width * 15h sht1.Range("N15").Height * 25Set ch1 s…

路径规划 | 基于改进蝙蝠算法的多无人机路径规划(Matlab)

目录 效果一览基本介绍程序设计参考文献 效果一览 基本介绍 路径规划 | 基于改进蝙蝠算法的多无人机路径规划(Matlab) 蝙蝠算法(Bat Algorithm)是一种基于自然界蝙蝠群体行为的启发式优化算法。该算法模拟了蝙蝠在寻找食物时的行为…

Github Copilot 使用技巧

🎯目标读者 本文不包含如何安装 Github Copilot本文介绍了 Github Copilot 使用方法和一些技巧 本人已经使用 Github Copilot 2 年了,交了 3 次年费,每年 100$ 着实心痛,但是用着确实爽歪歪 但是感觉一直只用了一小部分功能&am…

技术证书认证-附考试答案-AIGC与大模型通识-英特尔大湾区科技创新中心证书认证

目录 课程简介 面向人群 考核步骤 试题答案 知孤云出岫主页 课程以及考试链接:AIGC与大模型通识 - 英特尔大湾区科技创新中心 【英特尔大湾区科技创新中心】公益新课《AIGC与大模型通识》上线官网!首期结业认证进行中,提升AI应用技能&…

顶顶通呼叫中心中间件-通话之前录音配置方法(mod_cti基于FreeSWITCH)

顶顶通呼叫中心中间件-通话之前录音配置方法(mod_cti基于FreeSWITCH) 1、修改配置文件 点击配置文件 -> 点击vars -> 根据图中配置 -> 点击提交XML ->重新启动freeswitch 修改成true就是电话接通开始录音&#xff0c;修改成false就是通话之前开始录音。 <!--应…

微信小程序免费《短视频去水印》

分享一个uniapp开发的微信小程序免费《短视频去水印》小程序 <template><view class"content"><view class"area-wrap"><textarea name"" v-model"state.content" maxlength"800" id"" cols…

~Keepalived高可用集群~

一、Keepalived简介 是一个用于实现高可用性的解决方案&#xff0c;它主要应用于云主机的主备切换&#xff0c;以达到高可用性&#xff08;HA&#xff09;的目的。当主服务器发生故障无法对外提供服务时&#xff0c;动态将虚拟IP切换到备服务器&#xff0c;继续对外提供服务&a…

宏定义———C语言

*符号代表全部的意思*.i代表的是全部的点i文件 宏定义 &#xff1a; 1.定义&#xff1a; #define 宏名 常量功能&#xff1a;宏名代替常量&#xff0c;宏名要求全大写且见名知义 2.示例&#xff1a; #include <stdio.h> #define PI 3.14 #define Q 4 #define P QQi…

虚幻5|给武器添加碰撞检测与伤害

本章内容衔接上两章&#xff0c;需要完成上两章才能用本章内容 虚幻5|角色武器装备的数据库学习&#xff08;不只是用来装备武器&#xff0c;甚至是角色切换也很可能用到&#xff09;-CSDN博客虚幻5|普通攻击&#xff0c;使用接口更方便-CSDN博客 如有疑问&#xff0c;可访问…

利用EditPlus进行Json数据格式化

利用EditPlus进行Json数据格式化 git下载地址&#xff1a;https://github.com/michael-deve/CommonData-EditPlusTools.git (安装过editplus的直接将里面的json.js文件复制走就行) 命令&#xff1a;Cscript.exe /nologo “D:\Program Files (x86)\EditPlus 3\json.js” D:\P…

简单的敏感词提示功能

简单的敏感词提示功能 1. 需求 公司现在接到通知&#xff0c;部分接口的部分手动输入字段&#xff0c;需要新增敏感词报红提示&#xff0c;敏感词汇现在应该是7000多个左右&#xff0c;需要我们提供一个敏感词校验接口&#xff0c;如果前端输入敏感词&#xff0c;则前端提示出…

【网络】UDP回显服务器和客户端的构造,以及连接流程

文章目录 回显服务器&#xff08;Echo Server&#xff09;0. 构造方法1. 接收请求2. 根据请求计算响应3. 将响应写回客户端4. 完整代码 客户端&#xff08;Echo Client&#xff09;0. 构造方法1. 读取输入2. 构造一个 UDP 请求3. 从服务器读取响应4. 完整代码 服务器与客户端连…

【自动化测试】技术交流论坛

前言 本篇使用Selenium3Junit5对个人技术交流论坛进行简单的自动化测试&#xff0c;如有错误&#xff0c;请在评论区指正&#xff0c;让我们一起交流&#xff0c;共同进步&#xff01; 文章目录 前言1. 项目基础描述2. 编写手工测试用例3. 测试用例转自动化测试用例3.1 前置准…