Chapter 2 The Graphics Rendering Pipeline

    图形渲染管线是时时渲染的核心。管线的主要功能是通过虚拟摄像机、3D模型,光源,着色器,纹理等生成2D的图像。 模型在2D图像中的位置和形状取决于模型几何结构,环境特征,摄像机位置,模型的外貌取决于模型材质,光源,纹理,着色。

2.1 架构(Architecture)

    管线可以粗略的划分为三个阶段: 应用阶段(Application),几何阶段(Geometry),光栅化阶段(Rasterizer),每个阶段还可以划分出子阶段。
    应用阶段通常在CPU上执行,CPU通常是多核的,能够并行执行多个任务,应用阶段通常执行碰撞检测,global acceleration algorithms,物理模拟等。
    几何阶段通常在GPU上执行,进行变换,投影等处理。这个阶段处理要画什么,怎么画,哪里画的问题。GPU包含许多可编程核心和固定操作硬件(可配置不可编程,不可配置,不可编程)构成.
    光栅化阶段通常在GPU上执行,将几何阶段传递过来的数据渲染成一张图像。

2.2 应用阶段(The Application State)

    应用阶段在CPU上执行,所以开发者拥有绝对的控制权。
    应用阶段输出渲染图元给几何阶段。

2.3 几何阶段(The Geometry State)

    几何阶段主要负责逐多边形,逐顶点操作。这个阶段可以进一步拆分为以下功能阶段: 模型变换,视图变换,顶点着色,投影,裁剪,屏幕映射(不知道指的是不是视口变换)。

2.3.1 模型变换和视图变换(Model and View Transform)

    模型变换将模型空间转换成世界空间,视图变换将世界空间转换到观察空间。

2.3.2 顶点着色(Vertex Shading)

    顶点可以存储位置,法线,颜色等数据。
    顶点着色器可以输出颜色,纹理坐标,等数据,传递给光栅化阶段。
    顶点着色器通常在世界空间进行,有时为了针对光源,摄像机计算,转换成对应的空间也能方便计算。

2.3.3 投影(Projection)

    投影将 view volume 变换到一个立方体空间中,有两种投影方式: 正交投影,透视投影
    正交投影的特性是,近出的东西和远处的一样大,平行的两条线在投影后还是平行的,正交view volume本身就是一个立方体,所以正交投影只要进行平移和缩放就可以完成
    透视投影的特性是,近大远小,两条平行线在远处看起来是相交的。正交投影需要把原来的平头截体的空间转换到一个立方体空间中

2.3.4 裁剪(Clipping)

    只有整个或部分在 view volume 中的图元才需要进行光栅化,只有部分在view volume的图元才需要进行裁剪。通过投影变换,将图元投影到立方体空间中,可以方便裁剪。除了立方体的6个面,还可以增加额外的面进一步裁剪。裁剪阶段一般是不可编程的。

2.3.5 屏幕映射(Screen Mapping)

    只有通过裁剪后的图元才会进入屏幕映射阶段(如果图像是输出到屏幕上),屏幕映射后的坐标还是3维的,x,y坐标会映射到屏幕坐标上,z坐标保持不变。
    OpenGL 左下角为(0,0)点,DirectX左上角为(0,0)点

2.4 光栅化阶段(The Rasterizer Stage)

    光栅化利用几何体顶点的相关信息,将几何体转换成像素信息。
    光栅化阶段可以划分为4个子阶段: 三角形设置(Triangle Setup),三角形遍历(Triangle Traversal),逐像素着色(逐片元着色)(Pixel Shading(Fragment Shading)),合并(Merging)(有些书不把合并阶段分类到光栅化阶段).

2.4.1 三角形设置(Triangle Setup)

    三角形设置阶段计算提取三角形数据,这些数据可以通过扫描片元并进行插值来获得片元信息。这个阶段一般是不可配置不可编程的。

2.4.2 三角形遍历

    三角形遍历通过上一阶段生成的三角形数据,遍历三角形覆盖的像素,生成片元数据,片元数据通过对三个顶点数据进行插值得到,每个片元信息包含了深度信息,以及相关的着色信息,这个阶段一般是不可配置不可编程的

2.4.3 逐像素着色(逐片元着色)(Pixel Shading(Fragment Shading))

    逐片元着色通过上一个阶段生成的片元数据,输出各个片元的颜色信息,这个阶段是可编程的。有很多的技术可以使用,比如贴图操作,就像把图片贴到几何体上。贴图操作使用的图片可以是1D,2D,3D。

2.4.4 合并(Merging)

    合并阶段对上一个阶段生成的片元数据进行合并,得到最终的像素数据,合并的数据存放在color buffer中。这个阶段是可配置不可编程的。
    color buffer 中存放的是摄像机可见的图元颜色。合并的过程可以通过z-buffer的算法来实现 z-buffer是一个和color buffer一样大小的缓存,记录最近的被采纳的片元深度,对之后输入的片元信息,对比片元的深度和z-buffer的深度,一般如果片元的深度小于z-buffer中的深度,认为它离摄像机更近,应该采用新的片元信息作为最终像素,于是将片元颜色写入color buffer中,并将片元的深度信息写入z-buffer,对于透明几何体,z-buffer算法需要先渲染不透明几何体,再按照从后到前的顺序渲染透明几何体。
    color buffer 还带有alpha 通道,通过这个alpha通道我们可以进行一个可选的alpha测试,通过对比片元的alpha值和color buffer中的alpha值,来抛弃一些片元,比如一些透明的片元,这个阶段在z-buffer前进行
    stencil buffer可以控制片元渲染,stencil buffer可以在渲染片元的时候写入,然后通过stencil buffer中的值来控制抛弃或保留一些片元。比如我们在渲染一个实心圆的时候,写入stencil buffer,之后渲染其他图元的时候,可以和stencil buffer对比,如果通过才进行下一步的测试。(在渲染实心圆的时候把记录实心圆位置的stencil buffer 值为1,后续渲染其他图元,如果对应位置的stencil buffer是1才进行下一步,如果不是1,就抛弃,这样就可以保证后续图元只渲染在实心圆上)。
    使用双buffer的技术,可以避免出现边画边显示的问题,front buffer用于提供给显示器显示,back buffer 用于绘制。

2.5 Through the Pipeline    

    几何模型是由点,线,三角形这些片元构成的。这里使用用一个CAD程序来贯穿整个管线,这个程序用来测试一个手机设计模型。手机模型由线和三角形组成。
应用阶段
    应用阶段定义这个这个应用的各个操作,并将各个数据传输给几何阶段,如: 摄像机位置,光照信息,图元信息。
几何阶段
    视图变换矩阵和模型变换矩阵是在应用阶段计算出来的(投影矩阵?),顶点和法线在乘以这两个矩阵后,就转到了视口空间,接着使用光照数据,材质数据进行着色计算,然后进行投影计算,转换到一个立方体空间。然后进行裁剪。然后再进行屏幕映射,最后将得到的数据传递个光栅化阶段。
光栅化阶段
    在这个阶段,所有的图元都将被光栅化,最后转换为像素,可见性测试可以通过z-buffer,alpha test,stencil test 实现。

总结(Conclusion)

    渲染管线不止一种电影渲染通常使用 micropolygon pileline,学术研究、预测渲染会使用ray tracing renderers
    以前,开发者只能使用固定渲染管线。固定渲染管线无法编程。

延伸读物和资源

    A Trip Down the Graphics Pipeline,讲述使用软件实现固定渲染管线
    OpenGL Programming Guide

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值