应用阶段(Application)
将需要在屏幕上绘制出来的图元送入下一个阶段,并准备好灯光和渲染设置
💡 什么叫“应用阶段”?
应用阶段之所以叫“应用阶段”(Application Stage),是因为这个阶段主要由应用程序(如游戏、虚拟现实软件、图形编辑器等)负责。在这个阶段,应用程序会处理和准备渲染所需的场景、数据和逻辑,最终将这些信息发送到图形处理器(GPU)进行进一步的图形渲染操作。因此,这个阶段发生的所有事情都属于应用程序层面的工作,跟GPU的直接渲染还没有发生关系。
举个通俗易懂的例子:
想象你正在玩一个3D游戏,比如《塞尔达传说》或者《我的世界》:
- 应用程序逻辑:当你用手柄控制角色走动时,游戏需要通过代码处理这些输入,计算角色在场景中的新位置。游戏也会根据物理引擎计算碰撞效果,比如角色撞到一堵墙后停下来,而不是穿过墙壁。
- 场景管理:游戏引擎需要决定当前场景中哪些物体是可见的。比如,如果你站在房间的一角,只有你看到的那部分场景需要进行渲染。墙后面的部分可以被忽略,这样可以减少计算负担。
- 摄像机和视角设置:在游戏中,游戏的“相机”会跟随角色移动,应用程序要不断调整摄像机的位置、角度来更新玩家的视角,决定渲染的视图。
- 将数据发送给GPU:当角色移动后,应用程序需要告诉GPU:“现在角色在新位置了,接下来你需要渲染这个位置的场景”。然后,应用程序会把所有需要渲染的几何体、材质、光照等信息打包,交给GPU来处理。
类比:拍电影的准备工作
应用阶段就像拍电影时的准备工作。导演需要安排演员站位、准备道具、设定相机角度等一系列拍摄前的准备工作。真正的“拍摄”(即渲染)还没开始,但所有的设置和计划已经在导演(应用程序)层面决定好了,之后这些信息会交给“摄影师”(GPU)去实际拍摄每一帧。
虽然此时跟GPU的直接渲染还没有发生关系,但是当前阶段的修改会影响后续阶段的性能表现:例如在应用阶段的一些算法可能可以减少后续需要进行渲染的三角形数量。此外,一些应用阶段中的任务也可以通过GPU来执行(通过计算着色器(compute shader)),此时GPU可以视为一个并行的CPU.
总结下来,应用阶段主要负责准备图元,除此之外:
- 碰撞检测
- 处理操作输入
- 加速算法(如剔除)
- 后续的pipeline无法解决的一切问题
几何处理阶段(Geometry Processing)
该阶段运行在GPU上,并且负责大部分的逐三角形和逐顶点操作,可以细分为顶点着色、投影、裁剪和屏幕映射
顶点着色(vertex shading)
顶点着色阶段听起来叫“着色”,其实是因为早些时候的渲染中,物体的光照是逐顶点计算的,在这个过程中将光源与顶点的位置和法线进行计算,得到顶点颜色,再插值得到三角形内部像素颜色,所以这个阶段叫做顶点着色器(vertex shader),但随着现代GPU的出现,着色计算变得主要在后面的逐像素阶段进行(延迟渲染),因此顶点着色阶段可能不会进行着色计算,反而会去计算并设置与每个顶点都相关的数据,例如动画,毫无疑问这是一个【可编程阶段】。
💡 什么叫可编程阶段?
可编程阶段指的是在现代图形渲染管线(Rendering Pipeline)中,开发者可以使用**自定义的程序(着色器程序)**来控制这个阶段的行为,而不再仅仅依赖固定的硬件处理流程。通过编写这些着色器程序,开发者可以灵活地定义如何处理输入数据(如顶点、片段等),从而生成更加丰富的图形效果。固定功能管线 vs 可编程管线
在早期的图形渲染中,图形处理管线是固定功能的(Fixed-function Pipeline),这意味着各个渲染步骤(如顶点变换、光照、纹理映射等)的处理方式是预定义的,开发者无法对它们进行修改,只能使用图形API(如OpenGL、DirectX)中提供的固定操作。这种方式限制了渲染效果的多样性。
随着图形技术的发展,可编程渲染管线(Programmable Pipeline)出现了,它允许开发者通过编写小型程序(即着色器,Shader)来控制某些渲染阶段的行为,赋予了更多自由和灵活性。
现代渲染管线中有几个关键的可编程阶段:
- 顶点着色器(Vertex Shader):
- 这是第一个可编程阶段,负责对输入的每个顶点进行处理。开发者可以自定义如何对顶点进行坐标变换、计算光照、输出纹理坐标等。- 几何着色器(Geometry Shader):
- 可选的可编程阶段,允许开发者在顶点着色器之后,对图元(如三角形)进行进一步的处理。几何着色器可以生成、修改或删除图元,并且能够根据输入顶点生成更多几何数据。- 片段着色器(Fragment Shader,也叫像素着色器):
- 这是渲染管线中另一个重要的可编程阶段,负责每个片段(即屏幕上的像素)的处理。片段着色器通常用于计算每个像素的颜色、光照效果、纹理映射等。通过自定义片段着色器,开发者可以实现诸如反射、阴影、透明度等复杂的视觉效果。- 计算着色器(Compute Shader):
- 这是一个独立于传统渲染管线的可编程阶段,主要用于执行通用计算任务。它不直接用于渲染,但可以用于高效处理大量并行数据,比如物理模拟、图像处理等。
顶点着色阶段有两大任务:1. 计算顶点的屏幕坐标;2. 计算顶点的一些属性;
首先看顶点位置的计算
输入一组顶点坐标,位于模型上的这些顶点初始在自身的模型空间(模型坐标系),这些模型有一个Transform值,称为“模型变换”,指的是该模型调整自身位置和朝向,模型坐标系经过模型变换之后,原本的坐标就到达了世界坐标系,世界坐标系代表了世界空间,这个空间是唯一的,也就是计算机图形学的虚拟世界~所有对象都在这个世界中,共享一个世界坐标系。
然而,只有被相机“观测”到的模型才会被渲染,相机在世界空间中有一个位置参数和方向参数,分别对应相机的放置位置和朝向。这时对于渲染来说,就建立了一个相机坐标系,代表了一个相机空间,这个空间极其特殊: