混合渲染
混合渲染(Hybrid Rendering)从字面意思就是非繁多办法的渲染机制。这也就使得这个词,没有一个齐全规范且惟一精确的定义。首先大家须要明确,渲染的最终目标是出现画面,不论是图片,视频,还是实时交互的场景。
那为了这个最终的出现后果,如果渲染过程中采纳了很多种计划来混合实现,就能够说它是混合渲染。
咱们从不同的角度,总结了一些混合渲染的模式。依然不探讨具体的技术实现细节,只是为了不便大家了解概念。
基于管线的混合渲染,指的是一条渲染管线中,会用到不同的计算承载形式,最终来实现渲染工作。目前的计算承载形式包含:光栅化(Rasterization,蕴含Vertex Shader和Fragment Shader),计算着色器(Compute Shader),光线追踪着色器(Ray Tracing Shaders)。
渲染管线中,最根本的计算承载形式就是光栅化。原则上,光栅化是为了输入渲染内容的一整个渲染流程,同时也能够利用流程中的Vertex Shader和Fragment Shader进行一些计算的解决,然而光栅化过程中是产生在Render Pass中,其中有很多Fix Function,比方剔除,深度测试,颜色混合等,所以用光栅化来进行计算,其实是“不专一”的,效率会绝对低下。
光栅化对于一些光线不是很简单的场景依然是能够胜任的。然而如果光线一旦简单,它就没有方法很好地胜任简单的光线算法了,因而渲染成果也就不尽人意。
目前WebGL只具备光栅化须要的Vertex Shader和Fragment Shader(Extension版本除外),计算能力无限且不够灵便,渲染成果也不会特地优良。
WebGL为了实现比拟好的渲染成果,都是通过预烘焙的办法,将成果附加到贴图自身,以动态的形式进行展现,从而失去了对简单光线变换的实时应答能力。
为了解决光栅化的计算效率低下问题,古代图形API都提供了计算着色器,即Compute Shader。
WebGPU也利用了古代图形API的设计准则,同样反对Compute Shader。Compute Shader实质是一种通用计算的能力(GPGPU),齐全使用在Compute Pass中的,是“专一”的计算单元,很相似于CUDA(不过CUDA能够通过英伟达的显卡做到硬件芯片级别的减速,因而计算性能更高)。
有了这种通用计算能力,就不再是光栅化中的“模仿”计算了,而是专业级的计算能力。比方咱们用光栅化中的Fragment Shader模仿一些算法,只能限度在二维的立体坐标系中,而Computer Shader没有这种限度,也更加的灵便,速度更快。
光线追踪Ray Tracing是一项几十年前就有的技术,然而因为计算量太大,而无奈实现实时渲染。因为RTX显卡的呈现,让实时光线追踪这个概念再次失去了关注。
光线追踪是门路追踪的一种简略模式,然而这两个概念实质上都是一种数学算法。光线追踪着色器(Ray Tracing Shaders)就是特意为光线追踪这种数学算法而设计的,它由很多非凡着色器模块的组合而成。下图是RTX光线追踪的架构图:
既然光线追踪只是一种数学算法,那么任何语言和编程环境都能够对这个数学算法进行实现。
如果只看图形畛域,咱们能够用CUDA, Fragment Shader(OpenGL, WebGL),Computer Shader(WebGPU,Vulkan,Metal,DX11/DX12,OpenGL Extension),RXT(DX12/DXR, Vulkan)来实现光线追踪算法。
既然光线追踪算法用下面的形式都能够实现,为什么RXT会再次引爆这个概念呢?起因就是它能够实时地实现光线追踪算法。
RTX显卡针对光线追踪这一个十分重要且非凡的渲染算法,独自做了硬件级别的减速。通过硬件芯片能够间接运行下面提到的光线追踪过程中的各种着色器模块(能够了解成把CUDA的通用计算芯片从新设计,优化成更适宜运行光线追踪算法的芯片),这样就能够在3D场景中实时的实现光线追踪的运算后果,渲染更加优质的3D画面。
目前苹果的M1芯片还临时不反对对光线追踪算法的硬件加速,所以Metal还是通过相似于Compute Shader(Metal Performance Shaders)的办法来优化光线追踪算法。WebGPU也会在将来的版本中,退出对于RTX的反对,咱们一起期待!
三种计算承载形式:光栅化,计算着色器和光线追踪着色器都曾经介绍完了。它们之间并不是谁要代替谁,也没有一种完满的办法。
而对于不同的场景,使用不同的办法。所以,对于混合渲染的概念,置信大家也更加清晰了。只有混合应用了不同渲染办法的渲染管线,我都能够了解成是混合渲染的一种体现。
基于数据的混合渲染,指的就是对一个3D场景中的不同3D资源(模型,场景等)进行分类,相当于对3D资产数据进行拆分,把不同类别的3D数据放到不同的渲染节点进行渲染,最初通过网络通信技术,把数据合并到一个须要显示输入的节点上,进行最终的出现。
个别提到这种基于数据的混合渲染,都会和上一期咱们聊到的云渲染有些关联。因为这种数据拆分的模式能够让咱们人造地想到,把一些复杂度高,计算要求大的工作放到并行计算能力更强的云端,利用渲染集群进行计算。
而咱们的集体终端,只渲染计算量绝对较小的工作。云端渲染的后果,最终不论是以视频或图片的模式传给客户端,还是只把简单计算的后果返回给客户端,再由客户端进行最终的出现,都会大大降低客户端的开销。
在5G通信技术的疾速倒退下,更加多样灵便的渲染架构,例如边,端,云协同渲染也失去了更多的尝试和验证。
这种渲染形式,能够充分利用终端及终端左近的边缘节点的计算能力,防止了全云端渲染可能会遇到的“卡顿”问题。
而且,也是一种“进可攻退可守”的架构设计,通过渲染工作的解耦设计,能够在全终端渲染和全云端渲染之间灵便切换和调配,进而适应更简单的渲染需要。
基于管线的混合渲染
同济大学贾金元老师提出的协同混合渲染的网络架构
基于硬件的混合渲染
基于硬件的混合渲染,指的就是CPU和GPU能够同时参加渲染工作的一种混合渲染模式。这里咱们参考V-ray的混合渲染模式。首先要阐明的是,单纯的GPU渲染有两个问题:
1)很难进行Debug:GPU的程序如果出错根本都会返回一个kernel dump(就是内核挂掉了),不会有相应的报错信息提醒。
2)无奈充分利用CPU的性能:之前的渲染工作根本都是交给GPU来进行计算的,CPU把工作提交给GPU之后,CPU自身其实会处于一段时间的闲暇状态,等于白白浪费了计算能力。
为了解决这两个问题,V-ray提出的混合渲染就是能够让CUDA同时运行在CPU和GPU上,这样能够充分利用CPU提交工作给GPU之后,自身的闲暇工夫,同样能够进行渲染的计算工作。
通过测试,V-ray的混合渲染比单纯的GPU渲染,实现工夫均匀缩短了约20%左右。这里须要强调下,这种CPU和GPU同时进行的混合渲染模式,在WebGL的规范下是无奈实现的,因为它采纳的是全局状态机模式,CPU必须要期待GPU的运行后果,能力持续做下一个工作,简略说就是同步机制。
而WebGPU采纳了古代图形API的办法,齐全遵循异步模式,这样才具备实现这种混合渲染的根底能力。
基于框架的混合渲染
基于框架的混合渲染,指的是渲染过程能够从之前的框架转移到另外一个全新的框架上实现。
2019年,Unity提出Data-Oriented Technology Stack(DOTS)技术,并通过Hybrid Renderer来实现。DOTS的外围就是ECS(Entities, Components, Systems)的架构设计,也标记着ECS框架在游戏引擎中的利用(对于ECS的细节和优劣势咱们这里就不做探讨了)。
Unity的Hybrid Renderer带来的混合渲染,其实指的是能够让渲染过程从之前的OOP模式(Object-oriented Programming)转换到DOP模式(Data-oriented Programming),是把GameObjects转换成ECS中的 Entities。
最终的目标就是利用ECS的数据间断内存存储特色,进步缓存命中率,同时引入多核并行计算的劣势,放慢渲染过程。
讲到这里,咱们把一些常见的混合渲染的模式都曾经介绍完了。总结下就是,混合渲染没有一个固定的定义,只有把“渲染”混合应用,都能够叫混合渲染。
目前,咱们曾经介绍了离线渲染、实时渲染、云渲染、混合渲染。要强调的是,它们之间所用到的技术和场景,有很多都是互相交叠在一起的,并没有一个规范惟一的准则。
咱们心愿的是,大家如果在再次遇到这些概念,或者一些3D渲染引擎产品的时候,能够依照这些渲染分类,去疾速的进行定位和剖析,更好的帮忙咱们了解和学习,解决咱们遇到的问题,这样就曾经足够好啦!
起源:Orillusion