如果您开发过3D游戏,那么您可能会在现代图形引擎的研究中遇到术语“前向渲染和“延迟渲染

而且,通常,您必须选择一种在游戏中使用。但是它们是什么,它们有什么不同,应该选择哪一个?

许多灯光的延迟渲染(图片由Hannes Nevalainen提供)

现代图形管道

首先,我们需要对现代的或可编程的图形管线有所了解。

过去,我们在显示卡图形处理方面所受的限制。除了发送不同的纹理外,我们无法更改其绘制每个像素的方式,并且一旦顶点在卡上就无法扭曲顶点。但是时代变了,我们现在有了可编程的图形管线。现在,我们可以将代码发送到显卡,以更改像素的外观,使它们具有法线贴图的凹凸外观,并增加反射效果(以及极大的真实感)。

该代码采用geometryvertexfragment shader的形式,它们实质上改变了显卡渲染对象的方式。

可编程图形管线的简化视图

前向渲染

前向渲染是大多数引擎使用的标准,即用型渲染技术。您为图形卡提供几何图形,将其投影并将其分解为顶点,然后将其转换并拆分为片段或像素,这些片段或像素将在传递到屏幕之前进行最终的渲染处理。

前向渲染:几何着色器到顶点着色器到片段着色器

它是相当线性的,并且每次将每个几何图形向下通过管道一次以生成最终图像。

延迟渲染

顾名思义,在延迟渲染中,渲染将延迟一点,直到所有几何图形都通过管道为止。然后通过在最后应用阴影来生成最终图像。

现在,我们为什么要这样做?

延迟渲染:顶点到片段着色器的几何形状。传递到多个渲染目标,然后使用照明进行着色。

延迟照明是对延迟渲染的一种修改,它通过在场景中使用更多遍来减小G缓冲区的大小。

照明性能

照明是走一条路线而不走另一条路线的主要原因。在标准的前向渲染管线中,必须对可见场景中的每个顶点和可见场景中的每个片段执行照明计算。

如果您的场景具有100个几何图形,并且每个几何图形都有1,000个顶点,那么您可能有大约100,000个多边形(非常粗略的估计)。显卡可以很轻松地处理此问题。但是,当这些多边形被发送到片段着色器时,就会在此处进行昂贵的照明计算,并可能发生真正的减速。

开发人员尝试将尽可能多的光照计算推入顶点着色器,以减少片段着色器必须完成的工作量。

必须为屏幕上每个多边形的每个可见片段执行昂贵的照明计算,无论其是否重叠或被另一个多边形的片段隐藏。如果屏幕的分辨率为1024x768(绝对不是很高的分辨率),则需要渲染近800,000像素。您每帧可以轻松完成一百万个片段操作。而且,许多碎片永远不会进入屏幕,因为它们经过深度测试已被移除,因此照明计算被浪费了。

如果您有一百万个这样的片段,并且突然间您必须为每个灯光重新渲染该场景,那么您就跳到了[num lights] x 1,000,000每帧的片段操作!想象一下,如果您有一个充满路灯的城镇,而每个镇都是一个点光源...

可以使用大O表示法来编写用于估算此前向渲染复杂度的公式,如O(num_geometry_fragments * num_lights)。您可以在此处看到复杂度与几何图形数量和灯光数量直接相关。

碎片是可能的像素,如果深度测试未将其剔除,它们将最终出现在屏幕上。

现在,一些引擎通过切掉远处的灯光,组合灯光或使用光照贴图(非常流行,但静态)来优化此效果。但是,如果您需要动态光源以及很多动态光源,我们需要一个更好的解决方案。

延迟渲染以进行救援

延迟渲染是一种非常有趣的方法,它减少了对象数量,特别是减少了总片段数,并在屏幕上的像素上执行了照明计算,从而使用分辨率大小代替了总片段数。

大O标记表示的延迟渲染的复杂度为:O(screen_resolution * num_lights)

您可以看到,现在屏幕上确定有多少个对象都无关紧要,因此您可以愉快地增加照明数量。(这并不意味着您可以拥有无​​限的对象,它们仍然必须绘制到缓冲区以产生最终的渲染结果。)

让我们看看它是如何工作的。

大心脏的延迟渲染

使用多个渲染目标,将每个几何图形(但不带阴影)渲染到多个屏幕空间缓冲区。特别是,深度,法线和颜色都写入了单独的缓冲区(图像)。然后将这些缓冲区组合起来,以为每个光提供足够的信息以照亮像素。

Color,Depth和Normal缓冲区。(图片来自astrofa,通过Wikimedia Commons。)
使用三个缓冲区生成的最终照明(阴影)结果。(图片来自astrofa,通过Wikimedia Commons。)

通过知道像素有多远及其法线向量,我们可以将像素的颜色与光线结合起来以生成最终的渲染。

如何选择正确的渲染哪个?

简单的说,如果您使用许多动态光源,则应使用延迟渲染。但是,存在一些重大缺点:

  • 此过程需要具有多个渲染目标的显卡。旧显卡没有此功能,因此无法使用。
  • 它需要更高带宽。G-buff的原因,延迟渲染需要大量缓冲区,旧的显卡可能也无法处理。
  • 不能使用透明对象。(可以配合前向渲染结合在一起,解决此问题。)
  • 没有抗锯齿。但也有解决方案:边缘检测,FXAA。
  • 除非您使用对延迟渲染的修改称为Deferred Lighting,否则仅允许一种类型的材料。
  • 阴影仍然取决于灯光的数量,延迟渲染无法解决此问题。

如果您没有很多灯光或者希望能够在较旧的硬件上运行,则应坚持使用前向渲染,并用静态光照贴图替换很多灯光,结果也是很棒的。

结论

我希望此文会帮助你们对前向渲染和延迟渲染有所了解。您可以使用各种选项来解决渲染问题,但是在游戏开发开始时选择正确的选项非常重要,以避免以后出现困难的更改。

另外在U3D中还有顶点光照渲染,其功能完全可以在延迟渲染中实现,所以没有单独拿出来讨论.

图片渲染延迟_前向渲染与延迟渲染相关推荐

  1. mouseenter 延迟_前向渲染与延迟渲染

    如果您开发过3D游戏,那么您可能会在现代图形引擎的研究中遇到术语"前向渲染"和"延迟渲染". 而且,通常,您必须选择一种在游戏中使用.但是它们是什么,它们有什么 ...

  2. vue数据改变渲染问题_解决Vue中页面成功渲染数据undefined的问题

    前言 这个标题不太好取. 本文需要下面的知识:https://zhuanlan.zhihu.com/p/260811233​zhuanlan.zhihu.com 问题描述 我最近的一个功能需求是通过a ...

  3. 怎么看vray渲染进度_【3dmax疑难问题】渲染有进度条但渲染窗口不见了

    渲染的时候进度条出来了,但是没有渲染窗口,这种情况怎么处理呢? 下面来分析下出现这个问题的几个可能. 一.渲染帧窗口选项没有勾选,这种情况只要把它勾选上就可以了. 二.渲染窗口在屏幕以外(这种情况要分 ...

  4. postmessage 消息接收延迟_微信为什么会突然延迟接收消息?原来是它们搞的鬼!...

    不知道大家有没有这种经历,收到了微信消息,仔细看时间,发现是几十分钟前的消息:有时候,明明没有收到微信消息通知,打开微信一看,居然有好几条未读消息. 微信为什么会延迟接收消息甚至收到消息没有提醒了呢? ...

  5. 企业微信推送消息延迟_微信接收消息总是延迟?没有提醒,这3个功能赶紧设置一下...

    使用微信进行交流已经成为我们现在很常见的一种方式,这样不仅节省时间,还很方便,但是不知道大家有没有遇见过这种情况,手机微信消息出现延迟,或者说是有消息却没有提醒,这种现象的出现,给我们的工作和生活带来 ...

  6. vue延迟渲染组件_性能优化之组件懒加载: Vue Lazy Component 介绍

    这篇文章分享了从遇到前端业务性能问题,到分析.解决并且梳理出通用的Vue 2.x 组件级懒加载解决方案(Vue Lazy Component )的过程. 初始加载资源过多 问题起源于我们的一个页面,下 ...

  7. 游戏渲染技术:前向渲染 vs 延迟渲染 vs Forward+渲染(二)

    GTA5 2 前向渲染 前向渲染是三个光照技术中最简单的,也是游戏图形渲染中最常见的技术.出于这个原因,也是光照计算最昂贵的技术,它不允许在场景中出现大量的动态光源. 大部分使用前向渲染的图形引擎会采 ...

  8. 怎么通过id渲染页面_「快页面」动态配置化页面渲染器原理介绍

    引言 「快页面」是知乎内部一个快速搭建后台管理页面的平台,使用者仅用半小时即可将一个常规复杂度的后台页面开发完成. 「快页面」平台的基石是它的「渲染器」,一个能将 JSON 配置渲染成页面的 Reac ...

  9. mysql虚拟列表_「前端进阶」高性能渲染十万条数据(虚拟列表)

    前言 在工作中,有时会遇到需要一些不能使用分页方式来加载列表数据的业务情况,对于此,我们称这种列表叫做长列表.比如,在一些外汇交易系统中,前端会实时的展示用户的持仓情况(收益.亏损.手数等),此时对于 ...

最新文章

  1. VSCode设置折叠左侧资源管理器所有文件夹的快捷键Alt+X、切换左侧活动栏显示隐藏快捷键Alt+Q
  2. eigen跟踪MILTracker代码分析
  3. 红帽中出现”This system is not registered with RHN”的解决方案
  4. 人生时间计算器_工具拯救效率,高效拯救人生!70个全国工程人实用小工具+算量表格...
  5. 什么从什么写短句_2020抖音文案短句:爱情、励志、伤感合集,值得收藏!
  6. win32开发(画笔、刷子、字体)
  7. iOS 离屏渲染的研究
  8. 区块链扫盲 | 认知升级,虚拟货币骗子是什么样子的?
  9. C-Lodop使用及常见错误排查
  10. 《计算机网络》谢希仁第七版知识点总结
  11. Qt QTreeView 详解
  12. linux qt 屏幕亮度,调整14.04.1 屏幕亮度
  13. web前端——常用的标签
  14. 计算机中文输入法教案,智能ABC输入法教案
  15. 黑莓android系统,黑莓Passport的手机系统是什么?能升级安卓5.0吗?
  16. java.sql.SQLSyntaxErrorException: Unknown database ‘数据库名‘
  17. ELK - docker
  18. 深入Android应用开发_核心技术解析与最佳实践
  19. excel数字不能累加_如何修复不累加的Excel编号
  20. 项目记录-”海迪康”ipcamera客户端开发纪实

热门文章

  1. MongoDB 2.5 版本将提供新的查询引擎
  2. qq飞车服务器维护中是什么,《QQ飞车》服务器对赛车平跑稳定性的影响攻略
  3. 什么样的数据集可以被分成两类?
  4. 【STM32】FreeRTOS 其他任务 API 函数
  5. 【控制】《多智能体机器人系统信息融合与协调》范波老师-第5章-强化函数设计方法及其在学习系统的应用
  6. STM32 电机教程 31 - 无刷无感控制原理
  7. makefile中变量有哪些?
  8. 一文读懂全系列树莓派!
  9. 不忘初心helloworld,IMX6入门学习笔记
  10. 对图像进行二维离散Fourier变换