渲染方式怎么选(渲染方式有几种)


上一期呢,我们已经简单介绍了离线渲染,实时渲染,云渲染的基本概念了。大家可以参考上一期的文章:干货|四种渲染到底是啥?终于有人讲明白了!(上)。
我们接下来继续聊一下混合渲染。
混合渲染
混合渲染(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光线追踪的架构图:
https://developer.nvidia.com/rtx/ray-tracing



