[图形学笔记系列]渲染管线

1,028 阅读7分钟

为什么要学习渲染管线?

在我学习计算机图形学之前,我就很好奇要如何把现实世界的三维物体在计算机二维的屏幕中展现出来。当时我的想法很简单,如下图所示,想的是先确定输入输出,再研究其中的算法处理过程。

image.png

但是,这里的输入和输出是有问题的:

  • 一是物体的三维坐标这种描述太模糊了,你要以什么为基本单元去描述一个物体呢?是点、线还是面,所以要具体输入的究竟是什么数据。还记得以前上课的时候印象深刻的一句话叫点动成线、线动成面、面动成体,所以你只要记录一个物体的关键点,以及点与点之间的关系就能构造出该物体,这种关系在几何上的具体表现就是点与点之间是否有连线;
  • 二是仅仅有物体的几何特征还不足以描述现实世界的三维物体,物体的物理特征同光的相互作用所产生的视觉效果也要作为关键的输入数据,相应的输出结果也要包括屏幕上该像素的颜色特征例如色相、明度和纯度等;
  • 三是缺少光线信息和观察物体的视角信息,由二可知,物体真实的视觉效果依赖光线和物体的某些物理特征的相互作用,那么就不能缺少光线的信息,此外,在现实世界中,人眼的可视范围是有限的,我们总是从某个位置,向某个方位,看到一定范围的物体,所以也不能缺少观察物体的视角信息;
  • 四是输出数据描述的太模糊了,要具体输出的究竟是什么,其实如果只是单纯的转换点坐标,这个映射关系是没问题的,但是我们要体现点形成线、点形成面就必须要对符合相应关系的屏幕像素点进行填充,这就涉及到用离散的屏幕像素点去采样连续的线或者面的问题,比如用离散的像素表示两点及其连线的直线方程,所以这时候输出的就是描述观察者看到的物体的影像的屏幕像素坐标。那么,经过修改和整理,我的想法就变成如下所示。

未命名文件 (3).png

在我了解了一些图形学知识后,上面的输入输出就有了相关的概念对应,如下图所示。我们用物体的顶点坐标作为构建物体的关键点;将顶点之间的组织方式放入算法处理过程中,称为图元装配,比如用三角形组织各顶点、用线段组织各顶点或者就是把各顶点当作独立的点进行组织等等;用材质表示物体与光线相互作用的物理属性集合;还有就是在物体所在的场景中要添加摄像机作为观察者,添加光照以计算物体的颜色信息;将输出的结果存储在帧缓冲区中(常用一帧表述该瞬间的画面),帧缓冲区的二维索引相当于像素点的屏幕坐标,存储的值自然是以RGBA描述的颜色信息。

未命名文件 (1).png

扯了那么多,终于可以回答为什么要学习渲染管线了,因为它就是解决如何将现实世界的场景搬到计算机屏幕上这一问题的核心算法流程,当然将现实世界的场景搬到计算机屏幕上问题其实要复杂的多,并且受限于计算机的性能,更多是将简化了的现实世界的场景模型,或者是一些艺术创作的模型等在计算机上呈现,那们反过来,人们也可以通过计算机来创造和设计一些三维的作品。

渲染管线是什么?

经过上面的思考,我们应该知道渲染管线是什么了,它应该是一套算法组成的处理流程,这样的处理流程,不一定都是相同的,不同的平台可能不太一样,但是大差不差,对于我来说重要的是体会思路,我根据一些资料和自己的学习整理了如下的渲染管线示意图。渲染管线里具体的流程我会有另外的笔记,这里更多的思考,为什么要进行相应步骤的处理?处理之后的结果是什么这样? 渲染管线.png 模型变换的主要目的是将模型数据通过矩阵变换至世界坐标系下,因为模型的原始坐标是生成模型时的坐标数据,当我们将其放置在某个场景里的时候,所遵守的坐标系可能会不同,所以需要按需求进行一个转换;

视图变换的主要目的是以摄像机的观察位置、视角以及范围来看相应的场景,此时坐标系的原点变成了摄像机所在的位置,相应的模型的坐标也从世界坐标系转为以摄像机为坐标原点构建的坐标系中;

投影变换就像画素描一样,讲究一些透视技巧,近大远小这样,更符合观察的规律。

裁剪坐标系和齐次裁剪这个光谈不太好说,还是要结合具体的算法在后面讲解,它实质是将视锥体外的场景进行裁剪,只保留视锥体范围内的场景;

NDC标准化设备坐标系其实就是将看到的场景缩放到(-1, -1, -1)~(1, 1, 1)这样的规范坐标系下,方便进行数据处理。

背面剔除顾名思义就是将看不到的物体背面删除掉,优化一下处理的性能。

视口变换的目的主要是将场景从前面的标准化设备坐标系从(-1, -1, -1)~(1, 1, 1)转变成你计算机屏幕的大小。

图元装配实质就是按什么样的方式组织构成这个场景的顶点,画线、画三角面还是什么,通常用画三角面,因为三角形是最小的面单元,常常一个平面分割为多个三角形,以便进行算法的处理。

光栅化的目的就是用屏幕上的一个个像素点去描述图元装配后的场景,比如用这些像素点去描述一个三角面,除了采样三角形的边框,还要对其内部进行采样填充。

片元着色是什么呢,这里引入了一个片元的概念,我当时查了资料好久,没看懂,跟着人动手实现了一遍简单的光栅渲染器才明白,这玩意就是屏幕像素,之所以叫片元是因为,片元到屏幕上的像素之间还要经过一些着色和检测的过程,所以叫片元。那片元着色就可以简单的理解为给像素上色,当然这种颜色值需要通过一些算法计算才能还原出一些好看的视觉效果。

片元测试主要目的是对片元进行一些检测和处理例如深度测试、透明测试、模板测试、混合等等。

最后将通过片元测试的片元存入帧缓冲区中,再通过屏幕上的像素表现出来,这个流程就结束了。

后续

[图形学笔记系列] 实现一个简单的软光栅渲染效果-01

参考资料

GAMES101-现代计算机图形学入门-闫令琪

Fundamentals of Computer Graphics, Fourth Edition

Tiny renderer or how OpenGL works: software rendering in 500 lines of code

资源推荐

零基础如何学习计算机图形学