3D 开发:正向渲染与延迟渲染
最后更新于 2023-03-18 14:30:00
相对于 2D 开发,3D 开发由于有大量的概念需要进行学习了解因此门槛较高,近期刚好针对 3D 图形渲染技术中的两种常见技术正向渲染和延迟渲染进行了简单的了解,在此做个简单的记录,另外通过了解这些概念的同时也对光照相关的知识有了更深入的了解。
在此之前,虽然已经进行了相当多的开发实践,但由于场景受限,一直对于 3D 开发中的光照技术应用的偏少,不过恰好近期在学习了解性能相关的知识,在了解到渲染这方面的知识概念时,才意识到光照在 3D 开发中的是一个非常重要的技术。
渲染管线
无论是做普通的前端业务开发,还是数据可视化开发,了解程序性能瓶颈的一个关键方面是知道程序代码到 UI 视觉效果是如何实现(映射)的,也即渲染管线(Rendering Pipeline)。
上图概括了 3D 开发渲染管线的大体流程,即:应用程序、几何图形和光栅化。简单来说,应用程序的代码是一系列绘图逻辑的高度抽象,而这些逻辑代码被编译为底层的几何图元绘制指令,经过一系列运算后交给图形处理器完成光栅化,最终呈现在终端显示器上,具体内容参考维基百科等资料即可,这里不做赘述。
接下来主要是要了解一些常用概念,目的是对后续两种不同渲染技术进行分析说明时更容易理解。
着色器
这里首先需要了解的便是着色器的概念,在计算机图形学中,着色器是一种计算机程序,负责在 3D 场景渲染过程中计算适当的亮度、暗度和颜色级别,这个过程也被称之为着色。
在探讨 3D 开发中的渲染管线时,一定要结合软硬件来思考,换句话说,图形处理器(GPU)被设计为流水线架构,分成多个阶段,其中某些阶段由底层硬件暴露给上层软件可编程接口,着色器则为这些可编程的阶段提供了运行的程序。所以,可灵活编程的着色器程序,为 3D 开发提供了强大的图形处理能力。
上图是图形处理器的流水线架构设计的一个大体示意图,也可看作是渲染管线的硬件实现,其中绿色部分是可编程的阶段,而各种不同阶段的程序对应不同类型的着色器。
其中,顶点着色器(Vertex shaders)是最成熟和最常见的 3D 着色器类型,并且为提供给图形处理器的每个顶点运行一次。目的是将每个顶点在虚拟空间中的 3D 位置转换为它出现在屏幕上的 2D 坐标(以及 Z 缓冲区的深度值)。顶点着色器可以操纵位置、颜色和纹理坐标等属性,但不能创建新的顶点。
几何着色器(Geometry shaders)程序在顶点着色器之后执行。它们将整个原语作为输入,可能带有邻接信息。例如,在三角形上操作时,三个顶点是几何着色器的输入。然后着色器可以输出零个或多个图元,这些图元被光栅化并且它们的片段最终传递给像素着色器。
来自光栅化阶段的每个片段的数据由片段着色器(像素着色器,Pixel shaders)处理。片段着色器的输出是每个要写入的颜色缓冲区的颜色列表、深度值和模板值。片段着色器无法为片段设置模板数据,但它们可以控制颜色和深度值。
以上三类常见着色器中片段着色器是着色器编程中接触最多的,也算是最核心的。
最后,给出一张 Vulkan (新一代现代图形卡抽象设计 API)文档中对于渲染管线的示意图,相信这幅图能以更直观的方式帮助我们理解渲染管线。
渲染技术
在对前置概念渲染管线做了简单的了解之后,接下来便是本文的核心内容,两种不同的渲染技术。