跳转到主要内容

什么是图形渲染管线?

demi 提交于

<font size="4" style="line-height: 45px;" color="#c200ff"><strong>1. 什么是图形渲染管线?</strong></font>

管线的主要功能是生成或渲染二维图像、三维物体、光源、着色方程式、纹理等。渲染管线是实时渲染的底层实现。下图是渲染管线的基本构成,由3个阶段组成:应用程序,几何及光栅。每一个阶段本身都有可能是一条管线,就如图所示的几何阶段;或者一个部分并行的阶段,就如图所示的光珊阶段。在图中,应用程序阶段是单一的过程,但亦有可能是管线化或并行化。

<center><img width="600" src="http://imgtec.eetrend.com/files/2021-03/%E5%8D%9A%E5%AE%A2/100062991-12…; alt=""></center><br>

<font size="4" style="line-height: 45px;" color="#c200ff"><strong>2. 应用程序阶段</strong></font>

应用程序是开发人员完全控制的阶段,该阶段在CPU上执行。该阶段可以做的事情有:
<ul><li>优化算法以减少三角形数量</li>
<li>碰撞检测</li>
<li>纹理动画</li>
<li>基于变换的动画</li>
<li>等等</li></ul>

<font size="4" style="line-height: 45px;" color="#c200ff"><strong>3. 几何阶段</strong></font>

这个阶段可以分为如下几个功能阶段:
<ul><li>模型和视图变换</li>
<li>顶点着色</li>
<li>投影</li>
<li>裁剪</li>
<li>屏幕映射</li></ul>

<center><img width="600" src="http://imgtec.eetrend.com/files/2021-03/%E5%8D%9A%E5%AE%A2/100062991-12…; alt=""></center><br>

下面逐一介绍这几个功能阶段:

<font style="line-height: 45px;" color="#c200ff"><ul><li>模型和视图变换</li></ul></font>

(1)世界坐标系变换
这个阶段将每个模型自己的模型坐标空间转换为世界坐标空间。(顶点和法线经过矩阵变换到世界坐标空间)你可以通过允许一个模型有多个转换关系,那么一个模型在世界场景中就可以有多个实体。

(2)视图坐标系变换(也可以称摄像机、观察坐标系)
为了便于投影和裁剪,需要将世界坐标系中所有物体再次经过视图坐标系变换(通常让摄像机指向z轴的负方向,但是摄像机实际的位置和方向实现依赖于具体的API)。

下图为视图坐标系变换:
<center><img width="600" src="http://imgtec.eetrend.com/files/2021-03/%E5%8D%9A%E5%AE%A2/100062991-12…; alt=""></center><br>
以上两种坐标系变换都是使用4x4的矩阵相乘实现的。

<font style="line-height: 45px;" color="#c200ff"><ul><li>顶点着色</li></ul></font>

为了产生真实的效果,只是简单地把模型呈现出来是不够的。它们的外表、光线影响也需要被描绘出来。为了计算着色方程,每个顶点通常都要包含点的位置、颜色、法向量、纹理坐标或者其他数值用于计算方程所需要的信息,然后发送到光栅化阶段内插值计算。着色计算通常被发生在世界空间,因为这可以方便计算有关实体的位置关系。(如摄像机和光源)

<font style="line-height: 45px;" color="#c200ff"><ul><li>投影</li></ul></font>

接下来我们还要将物体投影到方形中。下图左边是正交投影,右边是透视投影。正交投影(也称平行投影)使得投影后的线段依然是平行的,而透视投影的线段是趋向相交的。经过投影后,三维坐标就变成了二维坐标,而z坐标被储存到了深度缓存中。
<center><img width="600" src="http://imgtec.eetrend.com/files/2021-03/%E5%8D%9A%E5%AE%A2/100062991-12…; alt=""></center><br>

<font style="line-height: 45px;" color="#c200ff"><ul><li>裁剪</li></ul></font>

下图是裁剪过程,裁剪使得不在方形外面的顶点被抛弃,或在相交的地方生成一个新的顶点。裁剪过程通常不是可编程的,该过程由硬件的固定操作完成。
<center><img width="600" src="http://imgtec.eetrend.com/files/2021-03/%E5%8D%9A%E5%AE%A2/100062991-12…; alt=""></center><br>

<font style="line-height: 45px;" color="#c200ff"><ul><li>屏幕映射</li></ul></font>

经过裁剪后留下的顶点通过屏幕映射与屏幕上的点对应。
<center><img width="600" src="http://imgtec.eetrend.com/files/2021-03/%E5%8D%9A%E5%AE%A2/100062991-12…; alt=""></center><br>

<font size="4" style="line-height: 45px;" color="#c200ff"><strong>4. 栅格化阶段</strong></font>

栅格化阶段可分为如下几个功能阶段:
<ul><li>三角形设置</li>
<li>三角形遍历</li>
<li>像素着色</li>
<li>合并</li></ul>

<center><img width="600" src="http://imgtec.eetrend.com/files/2021-03/%E5%8D%9A%E5%AE%A2/100062991-12…; alt=""></center><br>

下面逐一介绍这几个功能阶段:

<font style="line-height: 45px;" color="#c200ff">(1)三角形设置</font>

在这个阶段中,三角形表面的间距和其他数据将被计算。这个数据是用来三角形遍历过程的不同着色数据的插值产生。这个过程是由硬件自动完成的。

<font style="line-height: 45px;" color="#c200ff">(2)三角形遍历</font>

这个过程依据三角形产生在每个像素产生格子(或段)。这个过程也通常称为扫描转换。这个像素都经过内插值产生数据,这些数据包括深度、几何阶段产生的着色数据。这个过程是由硬件自动完成的。

<font style="line-height: 45px;" color="#c200ff">(3)像素着色</font>

逐像素通过内插值数据进行着色计算,不同于前两个功能阶段,这个过程是可编程的。

一个常用的像素着色就是纹理贴图:
<center><img width="600" src="http://imgtec.eetrend.com/files/2021-03/%E5%8D%9A%E5%AE%A2/100062991-12…; alt=""></center><br>

<font style="line-height: 45px;" color="#c200ff">(4)合并</font>

合并阶段的任务是合成现储存于缓冲器的由着色阶段产生片段的颜色。这个过程是不是完全可编程的,但是可以高度配置来产生不同效果。

这个过程还负责可见性。通常使用Z缓存(深度缓存)算法、alpha通道以及模板缓存,这些操作都称为栅格化操作或混合操作。还有一种技术叫积累缓冲区(accumulation buffer),可以用于产生动态模糊、景深、抗齿距、柔和阴影。

下面是一个模板缓存的示例:
<center><img width="600" src="http://imgtec.eetrend.com/files/2021-03/%E5%8D%9A%E5%AE%A2/100062991-12…; alt=""></center>
<center><img width="600" src="http://imgtec.eetrend.com/files/2021-03/%E5%8D%9A%E5%AE%A2/100062991-12…; alt=""></center><br>

<font color="#9a9a9a">版权声明:本文为CSDN博主「梦幻DUO」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。</font>
原文链接:https://blog.csdn.net/sinat_24229853/article/details/48766329