3.4 延迟渲染

news2025/1/11 5:52:35

一、渲染路径

1.渲染路径

渲染路径(Rendering Path)

决定光照的实现方式,当前渲染目标使用光照的流程。


二、渲染方式

1.前向渲染

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

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

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

测试环境:

2021.1.19f

8盏点光源

关闭天空盒

相机底色设为黑色

其余全是默认设置

前向渲染(pixel light count = 4)

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

规则一补充:

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

Pixel Light Count设置位置

上图可以看出,有4盏像素光,4盏顶点光。

淡蓝色既有像素光也有顶点光,而远处的深蓝色什么光都没有,不清楚unity内部怎么平衡这个权重的。

先看下前向渲染的光照的渲染顺序(Pixel Light Count = 4)

此处为语雀视频卡片,点击链接查看:录制_2021_11_19_15_02_43_370.mp4

Pixel Light Count = 8

此处为语雀视频卡片,点击链接查看:录制_2021_11_19_15_07_31_377.mp4

2.延迟渲染(Deferred Rendering)

主要解决大量光照渲染的方案。

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

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

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

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

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

延迟渲染图

测试环境和前向渲染一样。

可以看出延迟渲染(无论PixelLightCount为多少),和前向渲染(PixelLightCount = 当前最大像素光)渲染效果一致。

延迟渲染光照顺序(重新开了新场景懒得调光颜色了)

此处为语雀视频卡片,点击链接查看:录制_2021_11_19_16_05_05_164.mp4

注:当相机与灯光最大边界有一定距离时,会出现一个新的drawcall

第二个Pass用于LDR的转码,当相机组件的HDR选项关闭时,这个Pass就有用了

一个点光源的计算由两个DrawMesh组成,第二个就是我们绘制光源的pass,但第一个就不同了,第一个是draw就是用来限制渲染的范围的,可以看到用的shader是unity内置的,名字写的很清楚,其实就是通过模板缓冲区来规定范围,这样后面的第二个drawmesh(黄色),就只能在规定的mesh范围内渲染了,超出部分不会进行无用的计算。

参考链接:Unity里的延迟渲染_exclude_renderers-CSDN博客

各种G-buffer

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

1.后处理方式不同

前向渲染需要深度信息进行后处理,前向渲染需要单独渲染出一张深度图。

延迟渲染可以直接拿到渲染过程中存储深度信息的G-buffer来进行计算。

2.着色计算不同(shader)

前向渲染分主次光源,延迟渲染所有光源都会被完全计算不分主次。

前向渲染流程:待渲染几何体->顶点着色器->片元着色器->渲染目标。

延迟渲染流程:待渲染几何体->顶点着色器->MRT->光照计算->渲染目标。

3.抗锯齿方式不同

前向渲染支持MSAA,但是延迟渲染对于MSAA的支持并不好,因为MSAA会提前对像素进行光栅化处理。

4.不同渲染路径的优劣

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

扩充别的光照算法:

参考链接:游戏引擎中的光照算法 - 知乎


三、其他

unity渲染路径设置(2019.4.8)

移动端优化

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

Other Render Path

  • 延迟光照 (Light Pre-Pass / Deferred Lighting
    • 减少G-buffer占用的过多开销,支持多种光照模型
  • Forward+(即Tiled Forward Rendering,分块正向渲染)
    • 减少带宽,支持多光源,强制需要一个preZ
  • 群组渲染 Clustered Rendering
    • 带宽相对减少,多光源下效率提升

参考链接:游戏引擎中的光照算法 - 知乎

MSAA

Rendering 13

不同Path下光源Shader编写

PreZ / Zprepass

延迟光照的具体的思路是:

1、渲染场景中不透明(opaque )的几何体。将法线向量n和镜面扩展因子(specular spread factor)m 写入缓冲区。这个n/m-buffer 缓冲区是一个类似 G-Buffer的缓冲区,但包含的信息更少,更轻量,适合于单个输出颜色缓冲区,因此不需要MRT支持。

2、渲染光照。计算漫反射和镜面着色方程,并将结果写入不同的漫反射和镜面反射累积缓冲区。这个过程可以在一个单独的pass中完成(使用MRT),或者用两个单独的pass。环境光照明可以在这个阶段使用一个 full-screen pass进行计算。

3、对场景中的不透明几何体进行第二次渲染。从纹理中读取漫反射和镜面反射值,对前面步骤中漫反射和镜面反射累积缓冲区的值进行调制,并将最终结果写入最终的颜色缓冲区。若在上一阶段没有处理环境光照明,则在此阶段应用环境光照明。

4、使用非延迟着色方法渲染半透明几何体。

具体的流程图可以展示如下:

相对于传统的 Deferred Render,使用 Light Pre-Pass 可以对每个不同的几何体使用不同 的 shader 进行渲染,所以每个物体的 material properties 将有更多变化。

这里我们可以看出对于传统的 Deferred Render,它的第二步是遍历每个光源,这样就增加了光源设置的灵活性,而 Light Pre-Pass第三步使用的其实是 forward rendering,所以可以对每mesh 设置其材质,这两者是相辅相成的,有利有弊。

另一个 Light Pre-Pass 的优点是在使用 MSAA 上很有利。虽然并不是 100%使用上了 MSAA(除非使用 DX10/11 的特性),但是由于使用了Z 值和 Normal 值,就可以很容易找到边缘,并进行采样。

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

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

相关文章

电流反馈型运放以及PCB

电流反馈型运放,宽带放大器的布局布线,宽带放大器的PCB绘制的注意事项 控制放大倍数的芯片选择 高压摆率高输出功率只能选择TI THS系列 第(6)条实现不了整体闭环控制 反向输入端接电容会震荡,不接电容时可能会…

英语——分享篇——每日100词——901-1000

chemical——n.化学品——chemi车迷(拼音)cal(l)打电话(熟词)——车迷打电话买了大量化学品 ordinary——adj.平凡的,普通的——or偶人di弟na那ry人妖——平凡的偶人弟弟变成了那个人妖 container——n.容器——con肯(谐音)tain太闹(拼音)er儿(拼音)——小肯太闹&…

解析几何:计算两条线段的交点

大家好,我是前端西瓜哥。 今天来实现计算两条线段的交点的解析几何算法。 我们要实现 getLineSegIntersection 方法:提供两条线段,计算它们的交点。 每条线段会用两个点坐标表示。 const getLineSegIntersection (p1, p2, p3, p4) > …

多媒体应用设计师 第3章 多媒体信息传输技术

1.数据通信技术 1.1.多媒体通信的服务质量 多媒体服务质量(Qos)指网络服务的良好程度, 衡量QoS的常见指标为:吞吐量,差错率,端到端延迟,延迟抖动,带宽,丢包率,服务可用性等。 1.2.多媒体通信的服务质量类…

MDK Keil开发时出现问题汇总与解决办法--实战成功解决

文章目录 问题1:Error :Flash Download failed "Cortex-M4" 出现无法烧录问题点击烧录时出现下述图片:问题分析:发现没有添加编程算法描述:正确的情况是下面的点击Add按钮,选择主Flash添加:编译后…

windows每天定时重启 Win11 Win10定时重启 windows定时重启系统 windows每天定时重启

windows每天定时重启 Win11 Win10定时重启 windows定时重启系统 windows每天定时重启 使用 Windows 的任务计划程序来设置每天自动重启计算机1. 打开 任务计划程序:2. 在 任务计划程序库 面板中,创建一个基本任务3、设置计划任务权限 使用 Windows 的任务…

你真的了解微服务架构吗?

目录 写在前面 从单体架构说起 聊到分布式架构 聊回到微服务架构 微服务架构的关键技术 写在前面 随着互联网行业的快速发展,对服务的要求也越来越高,服务架构早就从原来单体架构逐渐演变为现在流行的微服务架构。 微服务(Micros…

代码随想录算法训练营第二十四天丨 回溯算法part02

216.组合总和III 思路 本题就是在 [1,2,3,4,5,6,7,8,9] 这个集合中找到和为n的k个数的组合。 相对于77. 组合 (opens new window),无非就是多了一个限制,本题是要找到和为n的k个数的组合,而整个集合已经是固定的了[1,...,9]。 本题k相当于…

目标跟踪数据集分享

360VOT: A New Benchmark Dataset for Omnidirectional Visual Object Tracking 360VOT 是一个新的大规模全景追踪基准数据集,旨在为全景视觉物体追踪提供支持。这个数据集包含了 120 个序列,总计超过 11.3 万张高分辨率帧,采用等距投影。追踪…

ImgPlus:基于CodeFormer的图片增强

背景 最近参与了华为云开发者大会AI赛道,做了一个AI图片增强作品,本片文章来简单介绍一下。 正文 作品名称:ImgPlus 赛题技术领域选择: AI,图片增强 使用技术名称: CodeFormer,ECS&#xff0…

NoVNC(Client)+TigerVNC(Server)搭建流程

1.NoVNC(Client)的搭建 1.1.下载 下载链接 https://github.com/novnc/noVNC/releases/tag/v1.4.0 1.2 解压 将解压后的文件放置在web应用的静态资源下 1.3 设置 -通过访问web项目静态资源的方式访问vnc.html -配置server端的访问websockify代理的ip和端口号。 -连接到服务…

Flink 的集群资源管理

集群资源管理 一、ResourceManager 概述 1、ResourceManager 作为统一的集群资源管理器,用于管理整个集群的计算资源,包括 CPU资源、内存资源等。 2、ResourceManager 负责向集群资源管理器申请容器资源启动TaskManager实例,并对TaskManag…

Modbus协议中浮点数的格式与换算

Modbus协议中浮点数(单精度)使用的是IEEE754标准浮点数(32位)的表示方法: IEEE754浮点数二进制格式示意图 1[31] 符号位(SIGN)8[23-30] 指数位(EXPONENT) 指数偏移量 12723[0-22] 尾数位(MANTISSA) 转换为10进制的公式: SGL (…

音视频技术开发周刊 | 315

每周一期,纵览音视频技术领域的干货。 新闻投稿:contributelivevideostack.com。 OpenAI科学家最新演讲:GPT-4即将超越拐点,1000倍性能必定涌现! GPT-4参数规模扩大1000倍,如何实现?OpenAI科学家…

数据结构复盘——第三章:栈和队列

文章目录 第一部分:栈1、栈的定义2、栈的操作 第一部分习题第二部分:共享栈1、共享栈的定义2、共享栈的操作 第二部分习题第三部分:链栈1、链栈的定义2、链栈的操作 第三部分习题第一到三部分小结1、顺序栈和链栈的比较2、栈的应用3、栈的应用…

正向代理流程

正向代理场景 已经拿下了一台服务器,该服务器有两个网卡,一个公网,一个私网未被攻击的服务器只有一个内网网卡,它不能和其他网段通信,只能在本网段通信,被叫做不出网主机攻击机需要直接连接未被攻击的服务器…

Shopee印尼站停止销售跨境商品:电商新规是否将改变印尼电商格局?

在全球电商市场竞争激烈的背景下,东南亚地区的印尼一直以其庞大的人口和不断增长的中产阶级而闻名。这个国家拥有着无限的潜力,吸引着各大电商平台争相进军。 然而,近期,一项关于电子商务的新法规引发了广泛的讨论和关注。据报道…

竞赛选题 深度学习YOLO安检管制物品识别与检测 - python opencv

文章目录 0 前言1 课题背景2 实现效果3 卷积神经网络4 Yolov55 模型训练6 实现效果7 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 **基于深度学习YOLO安检管制误判识别与检测 ** 该项目较为新颖,适合作为竞赛课题方向&…

C++ 快速排序算法

1、快速排序 步骤&#xff1a; 确定分界点 通常选 Q[L]、Q[(LR)/2]、Q[R]调整范围 使左边的 <X 右边 > X 也就是 左右两边的指针&#xff0c;依次比较定义的分界点&#xff08;X&#xff09;根据比较大小调整顺序 依次递归处理左右两端 模板代码&#xff1a; // 数组…

ExoPlayer架构详解与源码分析(5)——MediaSource

系列文章目录 ExoPlayer架构详解与源码分析&#xff08;1&#xff09;——前言 ExoPlayer架构详解与源码分析&#xff08;2&#xff09;——Player ExoPlayer架构详解与源码分析&#xff08;3&#xff09;——Timeline ExoPlayer架构详解与源码分析&#xff08;4&#xff09;—…