图形 3.4 延迟渲染管线介绍

延迟渲染管线介绍

B站视频:图形 3.4 延迟渲染管线介绍

文章目录

  • 延迟渲染管线介绍
  • 渲染路径
    • 前向渲染
      • 渲染流程
      • 光照规则
    • 延迟渲染
      • 渲染流程
      • 几何缓冲区 G-buffer
  • 不同渲染路径的优劣以及特性
    • 优劣
  • Unity中渲染路径设置
  • 移动端优化
    • 分块延迟渲染
  • 其他渲染路径
  • 不同路径下光源shader编写
  • 参考资料

渲染路径

渲染路径(Rendering Path),决定光照的实现方式。简言之,就是当前渲染目标使用光照的流程。

  • 前向渲染(Forward Rendering)
  • 延迟渲染(Defferred Rendering)

前向渲染

发生在渲染管线的顶点处理阶段,会计算所有的顶点的光照。全平台支持。

渲染流程

在这里插入图片描述

待渲染几何体 → 顶点着色器 → 片元着色器 → 渲染目标

在渲染每一帧时,每个顶点/片元都要执行一次片元着色器代码,这时需要将所有的光照信息都传递到片元着色器中。虽然大部分情况下的光源都趋向于小型化,而其照亮的区域也不大,但即便是光源离这个像素所对应的世界空间中的位置很远,但计算光照时,还是会把所有的光源都考虑进去

例如,物体受n个光源影响,那么在每一个片元执行着色器代码时,都必须把这n个光源都传递进着色器中执行光照计算。

在这里插入图片描述

光照规则

  • 规则一:最亮的几个光源会被实现为像素光照;
  • 规则二:然后最多4个光源会被实现为顶点光照;
  • 规则三:剩下的光源会被实现为效率较高的球面调谐光照(Spherical Hamanic),这是一种模拟光照。

规则一补充说明:

  • 最亮的那盏光一定是像素光照;
  • Light的Render Mode是important的光一定是像素光照;
  • 如果前面的两条加起来的像素光照小于Quality Setting里的Pixel Light Count(最大像素光照数量),那么从剩下的光源中找出最亮的那几盏光源,实现为像素光照;
  • 最后剩下的光源,按照规则二或规则三 ;
  • 在base pass里执行一盏像素光、所有的顶点光和球面调谐光照,并且进行阴影计算;
  • 其余的像素光每盏一个Additional Pass,并且这些pass里没有阴影计算;
  • 场景中看到的阴影,全是base pass里计算出最亮那盏像素光的阴影,其他像素光是不计算阴影的。

延迟渲染

延迟渲染(Deferred Rendering),主要解决大量光照渲染的方案

延迟渲染的实质,是先不要做迭代三角形做光照计算,而是先找出来能看到的所有像素再去迭代光照。直接迭代三角形的话,由于大量三角形你是看不到的,无疑是极大的浪费。

渲染流程

在这里插入图片描述

待渲染几何体 → 顶点着色器 → MRT → 光照计算 → 渲染目标

将渲染过程拆分成两个渲染通路(pass)。

第一个pass称为几何处理通路。首先将场景渲染一次,获取到待渲染对象的各种几何信息存储到名为G-buffer的缓冲区中,这些缓冲区将会在之后用作更复杂的光照计算。由于有深度测试,所以最终写入G-buffer中的各个数据都是离摄像机最近的片元的几何属性,这意味着最后在G-buffer中的片元必定要进行光照计算的。

第二个pass称为光照处理通路。该pass会遍历所有G-buffer中的位置、颜色、法线等参数,执行一次光照计算。

在这里插入图片描述

几何缓冲区 G-buffer

G-Buffer,全称Geometric Buffer ,译作几何缓冲区,它主要用于存储每个像素对应的位置(Position),法线(Normal),漫反射颜色(Diffuse Color)以及其他有用材质参数。根据这些信息,就可以在像空间(二维空间)中对每个像素进行光照处理。

在这里插入图片描述

不同渲染路径的优劣以及特性

  • 后处理方式不同

    假设需要深度信息来进行后处理,前向渲染就需要单独渲染出一张深度图,而延迟渲染就可以直接用G-Buffer里面的深度来进行计算。

  • 着色计算不同

    由于延迟渲染光照计算统一是在Light Pass中计算的,所以只能算一个光照模型,如果需要用到其他的光照模型,只能切换Pass。

在这里插入图片描述

  • 抗锯齿方式不同

优劣

渲染方式/优劣优点缺点
前向渲染1. 支持半透明渲染;
2. 支持使用多个光照pass;
3. 支持自定义光照计算方式。
1. 光源数量对计算复杂度影响巨大;
2. 访问深度等数据需要额外计算。
延迟渲染1. 大量光照场景优势明显;
2. 只渲染可见像素,节省计算量;
3. 对后处理支持良好;
4. 用更少的shader。
1. 对MSAA支持不友好;
2. 透明物体渲染存在问题;
3. 占用大量的显存带宽。

Unity中渲染路径设置

版本为2022.3.5f1c1

在这里插入图片描述

在这里插入图片描述

移动端优化

两个TBDR(分块延迟渲染,Tile-BasedDeferred Rendering)。

  • SIGGRAPH 2010上提出的,通过分块来降低带宽内存用量;
  • PowerVR基于手机GPU的TBR架构提出的,通过HSR减少overdraw。

分块延迟渲染

作为传统Defferred Rendering的另一种主要改进,分块延迟渲染(Tile-Based Deferred Rendering,TBDR)旨在合理分摊开销(amortize overhead),自SIGGRAPH 2010上提出以来逐渐为业界所了解。

我们知道,延迟渲染的瓶颈在于读写 G-buffer,在大量光源下,具体瓶颈将位于每个光源对G-buffer的读取及与颜色缓冲区混合。这里的问题是,每个光源,即使它们的影响范围在屏幕空间上有重叠,因为每个光源是在不同的绘制中进行,所以会重复读取G-buffer中相同位置的数据,计算后以相加混合方式写入颜色缓冲。光源越多,内存带宽用量越大。

而分块延迟渲染的主要思想则是把屏幕分拆成一个个小的分块,例如每 32 × 32 像素作为一个分块(tile)。计算每个分块的深度范围(depth range),求得每个 分块的包围盒(bounding box)。然后,计算每个分块的包围盒会受到哪些光源影响把那些光源的索引储存在分块的光源列表里。最后,逐个分块进行着色,对每像素读取 G-buffer 和光源列表及相关的光源信息。

因此,G-buffer的数据只会被读取1次且仅1次,写入 color buffer也是1次且仅1次,大幅降低内存带宽用量。不过,这种方法需要计算光源会影响哪些分块,这个计算又称为光源剔除(light culling),可以在 CPU 或 GPU(通常以 compute shader 实现)中进行。用GPU计算的好处是,GPU 计算这类工作比 CPU 更快,也减少 CPU/GPU 数据传输。而且,可以计算每个分块的深度范围(depth range),作更有效的剔除。

在这里插入图片描述

对比 Deferred Rendering,之前是对每个光源求取其作用区域 light volume,然后决定其作用的的 pixel,也就是说每个光源要求取一次。而使用 TBDR,只要遍历每个 pixel,让其所属 tile 与光线求交,来计算作用其上的 light,并利用 G-Buffer 进行 Shading。一方面这样做减少 了所需考虑的光源个数,另一方面与传统的 Deferred Rendering 相比,减少了存取的带宽。

在这里插入图片描述

其他渲染路径

  • 延迟光照 (Light Pre-Pass / Deferred Lighting)

    减少G-buffer占用的过多开销,支持多种光照模型。

  • Forward+(Tiled Forward Rendering,分块正向渲染)

    减少带宽,支持多光源,强制需要一个preZ。

  • 群组渲染(Clustered Rendering)

    带宽相对减少,多光源下效率提升。

具体请参考游戏引擎中的光照算法 - 知乎

不同路径下光源shader编写

在这里插入图片描述

参考资料

Real-Time Rendering笔记(6):正向渲染和延迟渲染 - 知乎

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

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

相关文章

Qt之串口设计-线程实现(十二)

Qt开发 系列文章 - Serial-port(十二) 目录 前言 一、SerialPort 二、实现方式 1.创建类 2.相关功能函数 3.用户使用 4.效果演示 5.拓展应用-实时刷新 总结 前言 Qt作为一个跨平台的应用程序开发框架,在串口编程方面提供了方便易用…

1.gitlab 服务器搭建流程

前提条件: 一、服务器硬件水平 搭建gitlab服务器最低配置要求2核4G,低于这个配置的服务器运行效果很差。 gitlab官网:https://about.gitlab.com/ 下载地址:gitlab/gitlab-ce - Packages packages.gitlab.com 本机ubuntu 二、安装依赖 su…

powerhsell 初认识

免责声明 本文是学习与泷羽Sec B站课程的课程笔记内容,仅作学习使用,如有破坏网络安全的行为,本人概不负责 B站链接:https://space.bilibili.com/350329294 资源自取:https://pan.quark.cn/s/b2718e905db8 powerhsel…

自我维护和保养

学习运动两不误! 本人学习过程中,长期久坐导致各种身体问题(特别是腰间盘突出,右侧肩胛骨翘等问题!),希望给有类似烦恼的人们带去福音!!! 我的椎间盘损伤历…

详解磁盘IO、网络IO、零拷贝IO、BIO、NIO、AIO、IO多路复用(select、poll、epoll)

1、什么是I/O 在计算机操作系统中,所谓的I/O就是输入(Input)和输出(Output),也可以理解为读(Read)和写(Write),针对不同的对象,I/O模式可以划分为…

Cursor的重磅功能Agent登场

今天看了一些介绍,cursor有一个新功能agent ,试用了一下非常好用。再也不用头痛地选择相关的上下文,真是懒人利器。 Agant特性: 可以自主选择上下文能够使用终端可以独立完成整个任务 赶紧介绍给大家,使用时,需要在c…

5G -- 空口关键技术

前言: 手机(UE)和5G基站(gNodeB)之间的空中接口 新技术的特点: 1、提升速率:大带宽、新编码、高阶调制、F-OFDM、M-MIMO 2、降低时延:灵活帧结构、自包含时隙、免授权调度、D2D 3、提升覆盖:上下行解耦、EN-DC(双连…

常用Python自动化测试框架有哪些?

随着技术的进步和自动化技术的出现,市面上出现了一些自动化测试框架。只需要进行一些适用性和效率参数的调整,这些自动化测试框架就能够开箱即用,大大节省了测试时间。而且由于这些框架被广泛使用,他们具有很好的健壮性&#xff0…

【自用】通信内网部署rzgxxt项目_01,后端pipeDemo部署(使用nssm.exe仿照nohup)

做完这些工作之后,不要忘记打开 Windows Server 的防火墙端口,8181、8081、8080、22、443、1521 做完这些工作之后,不要忘记打开 Windows Server 的防火墙端口,8181、8081、8080、22、443、1521 做完这些工作之后,不要…

jmeter 接口性能测试 学习笔记

目录 说明工具准备工具配置jmeter 界面汉化配置汉化步骤汉化结果图 案例1:测试接口接口准备线程组添加线程组配置线程组值线程数(Number of Threads)Ramp-Up 时间(Ramp-Up Period)循环次数(Loop Count&…

Iris简单实现Go web服务器

package mainimport ("github.com/kataras/iris" )func main() {app : iris.New() // 实例一个iris对象//配置路由app.Get("/", func(ctx iris.Context) {ctx.WriteString("Hello Iris")})app.Get("/aa", func(ctx iris.Context) {ct…

tryhackme-Pre Security-HTTP in Detail(HTTP的详细内容)

任务一:What is HTTP(S)?(什么是http(s)) 1.What is HTTP? (HyperText Transfer Protocol)(什么是 HTTP?(超文本传输协议)) http是你查看网站的时候遵循的…

【C++11】可变模板参数

目录 可变模板的定义方式 参数包的展开方式 递归的方式展开参数包 STL中的emplace相关接口函数 STL容器中emplace相关插入接口函数 ​编辑 模拟实现:emplace接口 C11的新特性可变参数模板能够让您创建可以接受可变参数的函数模板和类模板,相比 C9…

springmvc的拦截器,全局异常处理和文件上传

拦截器: 拦截不符合规则的,放行符合规则的。 等价于过滤器。 拦截器只拦截controller层API接口。 如何定义拦截器。 定义一个类并实现拦截器接口 public class MyInterceptor implements HandlerInterceptor {public boolean preHandle(HttpServletRequest reque…

ECharts热力图-笛卡尔坐标系上的热力图,附视频讲解与代码下载

引言: 热力图(Heatmap)是一种数据可视化技术,它通过颜色的深浅变化来表示数据在不同区域的分布密集程度。在二维平面上,热力图将数据值映射为颜色,通常颜色越深表示数据值越大,颜色越浅表示数…

EE308FZ_Sixth Assignment_Beta Sprint_Sprint Essay 3

Assignment 6Beta SprintCourseEE308FZ[A] — Software EngineeringClass Link2401_MU_SE_FZURequirementsTeamwork—Beta SprintTeam NameFZUGOObjectiveSprint Essay 3_Day5-Day6 (12.15-12.16)Other Reference1. WeChat Mini Program Design Guide 2. Javascript Style Guid…

JVM 详解

一. JVM 内存区域的划分 1. 程序计数器 程序计数器是JVM中一块比较小的空间, 它保存下一条要执行的指令的地址. [注]: 与CPU的程序计数器不同, 这里的下一条指令不是二进制的机器语言, 而是Java字节码. 2. 栈 保存方法中的局部变量, 方法的形参, 方法之间的调用关系. 栈又…

基于 uniapp 开发 android 播放 webrtc 流

一、播放rtsp协议流 如果 webrtc 流以 rtsp 协议返回&#xff0c;流地址如&#xff1a;rtsp://127.0.0.1:5115/session.mpg&#xff0c;uniapp的 <video> 编译到android上直接就能播放&#xff0c;但通常会有2-3秒的延迟。 二、播放webrtc协议流 如果 webrtc 流以 webrt…

frp内网穿透部署及使用

frp是什么 frp 是一款开源的高性能的反向代理应用&#xff0c;专注于内网穿透&#xff0c;它采用 C/S 模式&#xff0c;将服务端部署在具有公网 IP 的机器上&#xff0c;客户端部署在内网或防火墙内的机器上&#xff0c;通过访问暴露在服务器上的端口&#xff0c;反向代理到处…

基于MATLAB的图像增强

目录 一、背景及意义介绍背景图像采集过程中的局限性 意义 二、概述三、代码结构及说明&#xff08;一&#xff09;整体结构&#xff08;二&#xff09;亮度增强部分&#xff08;三&#xff09;对比度增强部分&#xff08;四&#xff09;锐度增强部分 四、复现步骤&#xff08;…