渲染流水线

1.前言  

  话不多说,直接开始干货吧!

  渲染流水线的最终目的在于生成或者说是渲染一张二维纹理,即我们在电脑屏幕上看到的所有效果。它的输入是一个虚拟摄像机、一些光源、一些Shader以及纹理等等。

2.综述

2.1 什么是流水线

  在工业上,流水线被广泛应用在装配线上。

  我们来举一个例子。假设,老王有一个生产洋娃娃的工厂,一个洋娃娃的生产流程可以分为4个步骤:
  第1步:制作洋娃娃的躯干;
  第2步:缝上眼睛和嘴巴;
  第3步:添加头发;
  第4步:给洋娃娃进行最后的产品包装。

  在流水线出现之前,只有每个洋娃娃完成了所有这4个工序后才能开始制作下一个洋娃娃。如果说每个步骤需要的时间是1小时的话,那么每4个小时才能生产一个洋娃娃。

  引入流水线后,虽然制作一个洋娃娃仍然需要4个步骤,但不需要从头到尾完成全部步骤,而是每个步骤由专人来完成,所有步骤并行进行。

    

  可以发现,流水线系统中决定最后生产速度的是最慢的工序所需的时间。理论情况下,如果把一个非流水线系统分成n个流水线阶段,且每个阶段耗费时间相同的话,会使整个系统得到n倍的速度提升。

2.2 什么是渲染流水线

  渲染流水线的工作任务在于由一个三维场景出发、生成(或者说是渲染)一张二维图像。换句话说,计算机需要从一系列的顶点数据、纹理等信息出发,把这些信息最终转换成一张人眼可以看到的图像,这个工作通常是由CPU和GPU共同完成的。

  一个渲染流程分成3个阶段:应用阶段(Application Stage)几何阶段(Geometry Stage)光栅化阶段(Rasterizer Stage),来自《Render-Time Rendering,Third Edition》一书。

  · 应用阶段

  通常由CPU负责实现,开发者具有这个阶段的绝对控制权。

  开发者有3个主要任务:
  首先,需要准备好场景数据,如摄像机的位置、视锥体、场景中包含了哪些模型、使用了哪些光源等等;
  其次,为了提高渲染性能,需要做一个粗粒度剔除(culling)工作,把那些不可见的物体剔除出去,这样就不需要再移交给几何阶段进行处理;
  最后,需要设置好每个模型的渲染状态,这些渲染状态包括但不限于它使用的材质(漫反射颜色、高光反射颜色)、使用的纹理、使用的Shader等。

  这一阶段的主要目的,在于输出渲染所需的几何信息——渲染图元(rendering primitives),可以是点、线、三角面等。这些渲染图元会被传递给下一个阶段——几何阶段。

  · 几何阶段

  几何阶段用于处理所有和我们要绘制的几何相关的事情。例如,决定需要绘制的图元是什么,怎样绘制它们,在哪里绘制它们。这一阶段通常在GPU上进行。

  几何阶段负责和每个渲染图元打交道,进行逐顶点、逐多边形的操作。几何阶段的一个重要任务就是把顶点坐标变化到屏幕空间中,再交给光栅器进行处理。通过对输入的渲染图元进行多步处理后,这一阶段将会输出屏幕空间的二维顶点坐标、每个顶点对应的深度值、着色等相关信息,并传递给下一个阶段。

  · 光栅化阶段

   这一阶段将会使用上个阶段传递的数据来产生屏幕上的像素,并渲染出最终的图像,在CPU上运行。

  光栅化的任务主要是决定每个渲染图元中的哪些像素应该被绘制在屏幕上。它需要对上一个阶段得到的逐顶点数据(例如纹理坐标、顶点颜色等)进行插值,然后进行逐像素处理。

  

猜你喜欢

转载自www.cnblogs.com/yoyocool/p/9667700.html