0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

正向渲染和延迟渲染彼此之间有什么不同

Dbwd_Imgtec 来源:未知 作者:李倩 2018-03-23 14:09 次阅读

如果你是一个游戏开发者,在你使用的图形引擎中或多或少都听说过forward rendering和deferred rendering。通常你必须在你的游戏中选择一种。但它们是什么,彼此之间有什么不同,我们又该如何选择呢?

Modern Graphics Pipelines(现代图形管道)

在开始之前,我们必须要知道一点现代可编程图形管线的一些知识。早些时候,我们被显卡的功能限制,不能去改变每个像素的绘制方式,除了发送一些不同的纹理外,不能去修改顶点的数据。现在时代已经改变,我们能够基于显卡的图形管线进行编程。我们能够发送代码到显卡去改变像素的外观(颜色),使用法线纹理(normal maps)改变它们外观使其变的突起,也可以添加反射(以及大量的现实主义)。

此代码采用几何,顶点和片段着色器的形式,从本质上来说,它们控制显卡如何去渲染对象。

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

Forward Rendering(正向渲染/前向渲染)

Forward Rendering 是大多数渲染引擎使用的渲染技术。你给显卡提供几何对象,它将几何对象分解成顶点送入顶点着色器,然后把这些顶点数据插值后分别送入片元/像素着色器,然后在它们被送入屏幕前做最终的渲染处理(模板测试,混合等)。

正向渲染:几何着色器到顶点着色器来分割着色器

这是一个线性的流程,每个几何对象分别通过渲染管线一步步的处理下去并产生最终的图像。

Deferred Rendering(延迟渲染)

延迟渲染,从这个名字来看就意味着渲染是被延迟的,直到所有几何对象都已经通过渲染管线处理后,在最后才应用着色(通过光照来决定最终的像素颜色)并产生最终的图像。

那么为什么要这样来处理呢?

延迟渲染:几何到顶点到片段着色器。传递给多个渲染目标,然后用光照阴影。

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

Lighting Performance(光照性能)

标准前向渲染(Forward Rendering)光照的性能消耗也是为什么要另辟蹊径选择其他渲染方式的主要原因。在标准前向渲染(Forward Rendering)管线流程中,每个灯光都会在每个顶点/或片元上执行光照计算,这也就是常说的逐顶点光照和逐片元/像素光照。

如果你在场景中有100个几何对象,并且每个几何对象有1000个顶点,你大约就有100000多变形(非常粗略的计算)。显卡还能够很轻松的处理,但是当这些多边形被发送到片元着色器时, 昂贵的对灯光消耗会使性能急剧下降。开发者可以尝试放置光照计算到顶点着色器减少片元着色器对光照的计算。

不管它是不是此像素上最顶层的片元,还是被遮挡的片元,昂贵的光照计算都会在每个多边形的每个可见片元上执行。如果屏幕的分辨率是1024x768,你有将近800000个像素需要被渲染。你能很轻易的就达到每帧百万级的片元操作。并且大多数的片元还会被剔除(深度测试阶段),那么对于此片元的光照就算就白费了。

如果你要对这样一个达到百万级片元的场景的每一灯光进行渲染,那么你在每一帧将跃升的一个灯光数量x1000000个片元的操作上!想象一下你有一个小镇的街道上面布满点光源!!!!!

计算前向渲染(Forward Rendering)复杂度的公式参见:big O notatio,复杂度公式:O(num_geometry_fragments * num_lights)。你能看到这里的复杂度是和几何对象数量和灯光数量直接相关的。

片元是一个最终可能在屏幕上成为像素的一个”待转像素“,如果在深度测试阶段不被剔除的话,它将在屏幕上成为屏幕的最终像素。现在一些引擎通过其他的方式优化了光照计算,比如:剔除非常远的灯光,组合灯管或使用 Light maps(非常流行的,但是只能是静态的物体)。如果你有大量的灯光需要动态光照的话,我们需要一个更好的解决方案。

Deferred Rendering to the Rescue(前向渲染的救星–延迟渲染)

延迟渲染(Deferred Rendering)是一个减少光照着色对象数量有趣的方法。尤其是对于总的片元对象来说,执行光照的片元数量直接由屏幕的分辨率决定。

延迟渲染(Deferred Rendering)的复杂性,在big O notation中是O(screen_resolution * num_lights)。

现在你能明白了,你有多少的光照数量是由你对灯光数量的使用来决定的。所以你能很高兴的增加你的灯光数量。(这不意味着你可以有无限的几何对象,它们还是要经过管线的及其他处理才能到G-Buffer中。)

The Guts of Deferred Rendering(延迟渲染的细节)

每个几何对象被渲染,但是没有使用光照,使用多目标渲染(multiple render targets),绘制出多个屏幕空间大小的Buffer。深度,法线和颜色分别写入各自的buffers(图像)。然后,这些Buffers和每个灯光像的素颜色进行合成,最后生成最终的图像。

颜色,深度和正常缓冲区。(图片由astrofa,通过维基共享资源。)

最终照明(阴影)使用三个缓冲区生成结果。(图片由astrofa,通过维基共享资源。)

选择哪一个呢?

一个最简短的回答是:如果你使用了大量灯光那么你就该使用延迟渲染(Deferred Rendering)了。但是延迟渲染(Deferred Rendering)也有一些明显的缺点:

• 这个处理需要显卡支持多目标渲染,老的显卡是不支持的,所有不能在上面工作,对于这个是没有变通的方案的,除非强制要求客服换显卡。

• 它需要高带宽的显卡,你要发送大的Buffer数据,老大的显卡可能处理不了。对于这个也没有变通的方案的,除非强制要求客服换显卡。

• 你不能使用透明对象。(除非你联合 使用deferred rendering 和Forward Rendering )。

• 没有抗锯齿。

• 仅有一个类型的材质被允许,除非你使用了被叫做Deferred Lighting的延迟渲染修改。

• 阴影依赖于光照的数量,延迟渲染没有解决任何阴影的问题。

如果你没有大量的灯光或者你想能够在比较老的显卡上允许,你应该选择使用前向渲染(Forward Rendering)并且替换你的灯光使用静态光照贴图。这个结果看起来还是令人吃惊的。

总结

我希望摆脱一些光照的主题。在这里你的选择是解决渲染问题,但是在游戏开始之前就做出正确的选择是非常重要的,因为可以避免日后的修改。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 显卡
    +关注

    关注

    16

    文章

    2357

    浏览量

    65851
  • 渲染
    +关注

    关注

    0

    文章

    60

    浏览量

    10752

原文标题:正向渲染和延迟渲染的区别

文章出处:【微信号:Imgtec,微信公众号:Imagination Tech】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    OpenHarmony Sheet 表格渲染引擎

    是对鸿蒙的原生 组件的封装接口,用于帮助你接受用户在界面中的输入,然后配合 this.table.xx 将数据层的数据渲染到表格渲染层,这里的输入需要真机调试,因为真机自带输入法,实测
    发表于 01-05 16:32

    LWRP的渲染流程

    LWRP渲染流程梳理
    发表于 01-21 07:01

    如何​在Android上进行高刷新率渲染

    ​在Android上进行高刷新率渲染
    发表于 01-26 06:37

    一文详解渲染管线

    渲染管线简单梳理
    发表于 02-03 07:13

    请问TableLayout图片是用什么渲染的?

    TableLayout图片是用什么渲染的,服务器返回的是网络图片String格式的。
    发表于 03-24 11:29

    OpenHarmony 3.2 Beta Audio——音频渲染

    一、简介Audio是多媒体子系统中的一个重要模块,其涉及的内容比较多,音频的渲染、音频的采集、音频的策略管理等。本文主要针对音频渲染功能进行详细地分析,并通过源码中提供的例子,对音频渲染
    发表于 03-02 14:28

    缺少VGlite字体渲染api文档,求分享

    我试图使用 vglite api 在 MIMXRT1166/1176 上使用 verisilicon gpu 渲染图形,并且特别缺乏关于此的文档。 我能够很好地初始化 GPU 并渲染矢量和光栅对象
    发表于 04-24 06:42

    HarmonyOS/OpenHarmony应用开发-ArkTS语言渲染控制概述

    ArkUI通过自定义组件的build()函数和@builder装饰器中的声明式UI描述语句构建相应的UI。 在声明式描述语句中开发者除了使用系统组件外,还可以使用渲染控制语句来辅助UI的构建,这些
    发表于 08-09 09:54

    HarmonyOS/OpenHarmony应用开发-ArkTS语言渲染控制ForEach循环渲染

    首次渲染时构建所有数组项。后续框架版本中可能会将此行为更改为延迟加载模式。 使用 index参数对UI更新性能有严重的负面影响,请尽量避免。 如果项构造函数中使用index参数,则项索引函数中也必须
    发表于 08-18 10:50

    HarmonyOS/OpenHarmony应用开发-ArkTS语言渲染控制if/else条件渲染

    ArkTS提供了渲染控制的能力。条件渲染可根据应用的不同状态,使用if、else和else if渲染对应状态下的UI内容。说明:从API version 9开始,该接口支持在ArkTS卡片中使用。一
    发表于 08-21 14:29

    PowerVR图像架构:延迟渲染

    在上一篇文章中,我谈到了GPU架构的工作原理。这是一个比较新颖的架构,与其他架构的工作方式不太相同,我们称之为基于区块贴图的延迟渲染或TBDR。从概念而言,其基本前提非常简单。 首先,我们把屏幕分成
    发表于 02-10 06:43 447次阅读
     PowerVR图像架构:<b class='flag-5'>延迟</b><b class='flag-5'>渲染</b>

    高通骁龙865移动平台首次将“端游级正向渲染”带入安卓平台

    高通骁龙865移动平台首次将“端游级正向渲染”带入安卓平台。作为新一代 Snapdragon Elite Gaming的特性之一,端游级正向渲染旨在让我们获得更好、更真实、更愿意沉浸其
    的头像 发表于 05-29 10:38 2639次阅读

    一文详解CPU渲染和GPU渲染之间的优劣

    CPU 渲染利用计算机的 CPU 来执行场景并将其渲染到接近完美。这也是执行渲染的更传统方式。然而,随着 GPU 的出现,基于 GPU 的渲染获得了很大的普及。
    的头像 发表于 03-08 14:50 1569次阅读

    3D渲染——光栅化渲染原理解析

    随着技术的发展,基于 GPU 的渲染技术得到了广泛应用,日常生活中常见的 3D 动画和游戏都是通过计算机渲染技术来实现。当前主要的 3D 渲染模型包括光栅化渲染和光线追踪两大类,本文主
    的头像 发表于 05-18 17:29 1514次阅读
    3D<b class='flag-5'>渲染</b>——光栅化<b class='flag-5'>渲染</b>原理解析

    揭秘:实时渲染、离线渲染、云渲染和混合渲染的区别

    渲染,就是将3D模型转换成2D图像,并最终呈现在屏幕上的过程。常见的渲染类型有以下几种:实时渲染离线渲染渲染混合
    的头像 发表于 12-26 08:27 238次阅读
    揭秘:实时<b class='flag-5'>渲染</b>、离线<b class='flag-5'>渲染</b>、云<b class='flag-5'>渲染</b>和混合<b class='flag-5'>渲染</b>的区别