Real- Time Rendering-图形渲染管线(The graphics rendering pipeline)

1、图像渲染管线描述的是什么

        图像渲染管线的主要功能是决定在给定虚拟相机,三维物体,光源,照明模式以及纹理等诸多条件的情况下,生成或者绘制一幅二维图像的过程。

        渲染图像的位置,形状是由他们的几何形状,环境特性,摄像机位置决定。而物体的外观是由材质特性,光源,纹理和着色模型确定。

2、图像渲染管线分为那几部分

  1. 应用程序阶段(The application stage)
  2. 几何阶段(The Geometry stage)
  3. 光栅化阶段(The Rasterizer stage)
  4. 像素处理(Pixel Processing)

        要点:

  • 每个阶段本身也可能是一条管线,如图中的几何阶段。还可以对有的阶段或者部分的并行化处理,如光栅化阶段。应用程序孙然是一个单独的过程,但是依然可以对之进行管线化或者并行化处理。
  • 最慢的管线阶段决定绘制速度,即图像的更新速度,这种速度用FPS表示,也就是每秒绘制的图像数量。                        

     应用程序阶段是由应用驱动,因此常搭载在CPU上运行的应用程序上,这些CPU包含多个核心,他们能够并行执行多个线程。使得GPU可以高效运行各种各样的应用阶段负责的任务。几何处理阶段主要处理变换,投影以及其他类型的几何处理。这个阶段主要去计算需要绘制什么,如何去绘制,还有在哪里绘制。几何阶段通常处于包含很多可编程核心以及固定功能硬件的图像处理单元中(GPU)。光栅化阶段通常会读取三个顶点作为输入来构造三角形,并且找到所有的被认为在三角形内部的像素。最后的像素处理阶段,对每一个像素执行程序决定他们的颜色,并进行深度测试来决定是否可见,可能也会执行一些每个像素的操作,如计算颜色与之前的颜色进行混合。光栅化和像素处理是完全在GPU上进行处理的阶段。   

        2.1 应用程序阶段

        应用程序阶段的通常实现的方法有碰撞检测,加速算法,输入检测,动画,力反馈以及纹理动画,变换仿真,几何变形,以及一些不在其他阶段执行的计算,如层次视锥裁剪等。主要的任务是:将需要在屏幕上显示的集合体(渲染图元 rendering primitive, 点 线和三角形),摄像机的位置,光照移交到几何处理阶段。应用程序阶段是基于软件的方式实现的,开发者能对该阶段发生的事情完全控制。虽然该阶段不能像几何和光栅化分为几个阶段,但可以在几个并行处理器上同时执行,提高性能。超标量体系结构,同一阶段,同一时间做不同的几件事情。

        2.2 几何阶段

        GPU上的几何处理阶段负责大部分的逐多边形和逐顶点的操作。这个阶段可以为分为

  • 模型视点变换 Model & view transform
  • 顶点着色 vertex shading 
  • 投影 projection
  • 裁剪 clipping
  • 屏幕映射 screen mapping

2.2.1 模型视点变换

        一个模型需要在多个不同的空间或者坐标系统中进行切换。最初模型位于模型空间。每个模型都有相应的模型空间。每个模型都拥有一个模型变换用来变换位置和方向,单个模型可能关联多个模型变换。即允许一个模型的多个复制体在不同的位置,方向和大小,而不需要复制基本几何。

        模型变换的是模型的顶点和法向量。物体对象的坐标是模型坐标,经过模型变换后的物体可以说是处于世界坐标系下。世界坐标系是唯一的,所有经过模型变换的模型都位于时间坐标系下。此外,仅仅被相机看到的模型才会被渲染。为了便于投影和裁剪,通过视图变换来变换相机和相应的模型。视图变换的目的是将相机放置原点并对准方向,使他看向Z轴的负方向,Y轴指向上方,X轴指向右边。通过这种方式勾画的空间称作相机空间。下图展示视图变换影响相机和模型的例子:

        总之,模型和视图变换分为模型变换和视图变换,模型变换目的是将模型变换到合适的渲染空间中去,视图变换的目的是将摄像机放置于坐标原点,方便后续流程。

        2.2.2 顶点着色

        渲染一张真实的图像,不仅仅需要对象的位置和形状,还需要对他们的外观进行建模。包括每个对象的材质,光源在对象上的效果。决定灯光在材料上的效果就是所说的着色(shading)。着色过程涉及在对象上各个点处计算着色方程。这些计算一些在你几何阶段期间在模型的顶点上执行,而其他计算可以在每个像素光栅化期间执行。可以在每个顶点存储一些材料数据,如点的位置,法向量,颜色或者其他计算着色所需的数据。顶点着色的结果(颜色,项链,纹理坐标或者其他种类的着色数据)传递到光栅化和像素处理阶段,进一步插值和计算表面颜色。

        通常,着色认为在世界空间中进行,实际中,将相关实体(相机和光照)转换到其他空间(模型或者相机空间)中也可得到正确结果。这是因为着色过程中所有实体变换到相同空间,着色计算中的诸多光源,模型和相机的相对位置不变。

        总结:顶点的着色阶段在于确定模型上顶点处材质的光照效果。

2.2.3 投影 projection

        光照处理后,渲染系统就进行投影操作,即将视体变换到一个单位立方体中,左上角(-1,-1,-1),右下角(1,1,1)。这个单位立方体也称作规范立方体(CVV canonical view volume)。

        主要有二种投影算法:

  • 正交投影 (orthographic projection)
  • 透视投影  (perspective proection)

        二种投影算法的主要区别:

  •  正交投影的视体通常是一个矩形,正交投影变换将这个视体变换成单位立方体。主要特点是原先平行的线在变换后依旧平行。这个变换是平移和缩放的组合。
  • 透视投影,对象距离相机越远,投影之后它越小。此外,平行线可能会在地平线处相聚。透视投影模仿我们感知物体对象大小方式。视体/视锥是金字塔形。

        正交投影和透视投影都可以有4*4矩阵构建。这个矩阵并且经历无论哪种变换,都说物体处于裁剪坐标中,即归一化处理后的设备坐标中。变换完成后,Z坐标的值不会保存与得到的投影图片中,而是存在Z缓存中(Z-buffer)。

        总结,投影阶段就是将模型从三维空间投影到二维空间中的过程。

   2.2.4 裁剪 clipping 

        只有当图元全部或者部分存在于视体内部的时候,才需要将其发送到光栅化阶段。这个阶段可以将图元在屏幕上绘制出来。

        一个图元(点 线 举行)相对于视体内部的位置,分为三种情况,完全位于内部,完全位于外部,部分位于内部。

  • 图元完全位于内部的进入下一阶段
  • 图元完全位于外部,不会进入到下一阶段,可直接丢弃,无需渲染。
  • 图元部分位于内部,对位于视体内部的图元进行裁剪处理。裁剪过程如下图:

        总结: 裁剪阶段的目的对部分位于视体内部的图元进行裁剪。

2.2.5 屏幕映射 screen mapping

        只有在视体内部的图元猜你可以进入到屏幕映射阶段。进入这个阶段时,坐标仍然是三维的。每个图元的X坐标和Y坐标坐标变换到屏幕坐标系中,屏幕坐标系连同Z组坐标称作窗口坐标。

        假定一个窗口里对场景进行绘制,窗口的最小坐标为(x1, y1)最大坐标(x2, y2)。屏幕映射就是平移后接一个缩放操作。Z坐标不受影响。

        屏幕映射的困难之处是整型和浮点型点值如何与像素坐标和纹理坐标进行关联。?

        总之,屏幕映射的主要目的是将之前得到的坐标映射到对应的屏幕坐标系上。

2.3 光栅化阶段

        给定经过变换和投影后的顶点,颜色和纹理坐标(均来自几何阶段),给每个像素正确配色,正确绘制整幅图像。这个过程称作光栅化或扫描变换。即从二维顶点所处的屏幕空间(所有顶点都包含Z值,即深度值,及各种与之有关的着色信息)到屏幕上的像素的转换。

        与几何阶段相似,该阶段主要分为几个功能阶段:

  • 三角形设定阶段。triangle setup
  • 三角形遍历。triangle traversal 

2.3.1 三角形设定 triangle setup 

        三角形设定阶段主要用来计算三角形表面的差异,和三角形表面其他的相关数据。该数据主要用于扫描转换,以及由几何阶段处理的各种着色数据插值操作所用。该过程在专门为其设计的硬件上执行。

2.3.2 三角形遍历 triangle traversal 

        三角形遍历阶段进行逐像素检查操作,检查该像素处的像素中心是否由三角形覆盖,而对于有三角形部分重合的像素,将在其重合部分生成片段。fragment

        找到那些采样点或像素在三角形中的过程称作三角形遍历或扫描转换。每个三角形片段的属性均由三个三角形顶点的数据插值而成。这些属性包括片段的深度,以及来自几何阶段的着色数据。

        总结,找到那些采样点或像素在三角形中的过程通常叫三角形遍历或扫描转换

2.4 像素处理 pixel process

        像素处理是逐像素逐采样点的计算阶段,像素处理分为        

  • 像素着色 pixel shading
  • 合并 mergeing
2.4.1 像素着色 pixel shading

        所有逐像素的着色计算都在像素着色阶段进行,使用插值得来的着色数据作为输入,输出结果为一种或者多种将被传送到下一阶段的颜色信息。纹理贴图操作就在这个阶段进行。

        像素着色在可编程的GPU内执行,在这一段有大量的技术可以应用,其中最常见的技术之一是纹理贴图。简单来说纹理贴图就是将指定图片贴到物体上的过程。而指定的图片可以是一维,二维或者三维的。

        总结,像素着色阶段的主要目的是计算所有需逐像素操作的过程。
2.4.2 合并 merging

        每个像素的信息都储存在颜色缓冲器中,而颜色缓冲器是一个颜色的矩阵列(每种颜色包含红、绿、蓝三个分量)。融合阶段的主要任务是合成当前储存于缓冲器中的由之前的像素着色阶段产生的片段颜色。不像其它着色阶段,通常运行该阶段的GPU子单元并非完全可编程的,但其高度可配置,可支持多种特效。

        此外,这个阶段还负责可见性问题的处理。这意味着当绘制完整场景的时候,颜色缓冲器中应该还包含从相机视点处可以观察到的场景图元。对于大多数图形硬件来说,这个过程是通过Z缓冲(也称深度缓冲器)算法来实现的。Z缓冲算法非常简单,具有O(n)复杂度(n是需要绘制的像素数量),只要对每个图元计算出相应的像素z值,就可以使用这种方法,大概内容是   

        Z缓冲器器和颜色缓冲器形状大小一样,每个像素都存储着一个z值,这个z值是从相机到最近图元之间的距离。每次将一个图元绘制为相应像素时,需要计算像素位置处图元的z值,并与同一像素处的z缓冲器内容进行比较。如果新计算出的z值,远远小于z缓冲器中的z值,那么说明即将绘制的图元与相机的距离比原来距离相机最近的图元还要近。这样,像素的z值和颜色就由当前图元对应的值和颜色进行更新。反之,若计算出的z值远远大于z缓冲器中的z值,那么z缓冲器和颜色缓冲器中的值就无需改变。

        上面刚说到,颜色缓冲器用来存储颜色,z缓冲器用来存储每个像素的z值,还有其他缓冲器可以用来过滤和捕获片段信息。如 alpha通道(alpha channel)和颜色缓冲器联系在一起可以存储一个与每个像素相关的不透明值、模板缓冲器(stencil buffer)用于记录所呈现图元位置的离屏缓存、帧缓冲器(frame buffer)通常包含一个系统所具有的所有缓冲器,但有时也可以认为是颜色缓冲器和z缓冲器的组合、累计缓冲器(accumulation buffer)用一组操作符对图像进行累积,为了产生运动模糊(motion blur.,可以对一系列物体运动的图像进行累积和平均。

​​​​​​​​​​​​​​        而当图元通过光栅化阶段之后,从相机视点处看到的东西就可以在荧幕上显示出来。为了避免观察者体验到对图元进行处理并发送到屏幕的过程,图形系统一般使用了双缓冲(double buffering)机制,这意味着屏幕绘制是在一个后置缓冲器(backbuffer)中以离屏的方式进行的。一旦屏幕已在后置缓冲器中绘制,后置缓冲器中的内容就不断与已经在屏幕上显示过的前置缓冲器中的内容进行交换。注意,只有当不影响显示的时候,才进行交换。

        融合阶段的主要任务是合成当前储存于缓冲器中的由之前的像素着色阶段产生的片段颜色。此外,融合阶段还负责可见性问题(Z缓冲相关)的处理。

        3 本章内容总结

        图形渲染管线的主要功能就是决定在给定虚拟相机、三维物体、光源、照明模式,以及纹理等诸多条件的情况下,生成或绘制一幅二维图像的过程。在概念上可以将图形渲染管线分为三个阶段:应用程序阶段、几何阶段、光栅化阶段,像素处理阶段。 

        3.1 应用程序阶段

        应用程序阶段的主要任务,是将需要绘制图元输入到绘制管线的下一个阶段,以及实现一些软件方式来实现的方法。主要方法有碰撞检测、加速算法、输入检测,动画,力反馈以及纹理动画,变换仿真、几何变形,以及一些不在其他阶段执行的计算,如层次视锥裁剪等加速算法。

        对于被渲染的每一帧,应用程序阶段将摄像机位置,光照和模型的图元输出到管线的下一个主要阶段,即几何阶段。

        3.2 几何处理阶段

        几何阶段主要负责大部分多边形操作和顶点操作,可以将这个阶段进一步划分成如下几个功能阶段:模型视点变换、顶点着色、投影、裁剪、屏幕映射。这些功能阶段的主要功能如下:

  • 【模型和视图变换阶段】:模型变换的目的是将模型变换到适合渲染的空间当中,而视图变换的目的是将摄像机放置于坐标原点,方便后续步骤的操作。
  • 【顶点着色阶段】:顶点着色的目的在于确定模型上顶点处材质的光照效果。
  • 【投影阶段】:投影阶段就是将模型从三维空间投射到了二维的空间中的一个过程。投影阶段也可以理解为将视体变换到一个对角顶点分别是(-1,-1,-1)和(1,1,1)单位立方体内的过程 。
  • 【裁剪阶段】裁剪阶段的目的,就是对部分位于视体内部的图元进行裁剪操作。
  • 【屏幕映射阶段】屏幕映射阶段的主要目的,就是将之前步骤得到的坐标映射到对应的屏幕坐标系上。

        在几何阶段,首先,对模型的顶点和法线进行矩阵变换,并将模型置于观察空间中(模型和视图变换),然后,根据材质、纹理、以及光源属性进行顶点光照的计算(顶点着色阶段),接着,将该模型投影变换到一个单位立方体内,并舍弃所有立方体之外的图元(投影阶段),而为了得到所有位于立方体内部的图元,接下来对与单位立方体相交的图元进行裁剪(裁剪阶段),然后将顶点映射到屏幕上的窗口中(屏幕映射阶段)。在对每个多边形执行完这些操作后,将最终数据传递到光栅,这样就来到了管线中的最后一个阶段,光栅化阶段。

3.3 光栅化

        给定经过变换和投影之后的顶点,颜色以及纹理坐标(均来自于几何阶段),给每个像素正确配色,以便正确绘制整幅图像。这个过个过程叫光栅化,即从二维顶点所处的屏幕空间(所有顶点都包含Z值即深度值,及各种与相关的着色信息)到屏幕上的像素的转换。光栅化阶段可分为三角形设定阶段、三角形遍历阶段。这些功能阶段的主要功能如下:

  • 【三角形设定阶段】三角形设定阶段主要用来计算三角形表面的差异和三角形表面的其他相关数据。
  • 【三角形遍历阶段】找到哪些采样点或像素在三角形中的过程通常叫三角形遍历。

        在光栅化阶段,所有图元会被光栅化,进而转换为屏幕上的像素。首先,计算三角形表面的差异和三角形表面的其他相关数据(三角形设定阶段),然后,找到哪些采样点或像素在三角形中(三角形遍历阶段)。

3.4 像素处理阶段

        计算每个可见图元上面每个像素的颜色,其中包含纹理贴图和可见性处理方法。

  • 【像素着色阶段】像素着色阶段的主要目的是计算所有需逐像素计算操作的过程。

  • 【融合阶段】融合阶段的主要任务是合成当前储存于缓冲器中的由之前的像素着色阶段产生的片段颜色。此外,融合阶段还负责可见性问题(Z缓冲相关)的处理。

       像素处理阶段计算所有需逐像素计算操作(像素着色阶段),然后,合成当前储存于缓冲器中的由之前的像素着色阶段产生的片段颜色,可见性问题可通过Z缓存算法解决,随同的还有可选的alpha测试和模版测试(融合阶段)。所有对像依次处理,而最后的图像显示在屏幕上

Real-Time( Rendering 4th Edition 实时渲染第四版 第二章 图形渲染管线(The Graphics Rendering Pipeline)-CSDN博客

https://github.com/QianMhttps://github.com/QianMo/Game-Programmer-Study-Notes/tree/master/Content/《Real-Time%20Rendering%203rd》读书笔记/Content/BlogPost02https://github.com/QianM

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值