Graphics Pipeline

Tags:

本文简单梳理了实时渲染管线过程。主要参考了《RTR》3rd。

(更新ing)

概览

基本架构:三大阶段

  1. Application:CPU负责,把各种几何体信息输送到Geometry阶段,如点、线、三角形。
  2. Geometry
  3. Rasterizer

每一个阶段内部是次一级的管线。

Application阶段

这个阶段是不需要细分子管线的,因为是在CPU处理,假设是单线程,那么并没有管线处理的能力。不过可以用多核多线程,来实现并行计算。

Geometry阶段

细分:

model and view transform

简单地说,model transform用来控制对象在世界空间的位置、朝向、缩放等,而view transform和camera有关,camera决定了观察世界空间的角度(把世界空间转换到以摄像机为中心的摄像机空间),即决定了view transform。

vertex shading

顶点着色,不是必须,因为存在延迟渲染这种东西。pass。

projection

投影转换,作用是把处于view空间的顶点转换到规范化的view volume(也叫frustum)。规范化是指坐标范围会映射到[-1,-1,-1]到[1,1,1] 或者 [0,0,0]到[1,1,1]。

有两种投影转换,一是平行(正交)投影,二是透视投影。

clipping

裁剪的依据是:几何体的部分或全部在view volume里时,这个几何体才需要被送往光栅化阶段。

裁剪放在projection之后的好处是,裁剪时几何体都已在规范化的空间(unit cube)里了。

裁剪是硬件上实现的。

screen mapping

这一步把frustum下的x、y坐标转换到屏幕坐标(screen coordinate),如果算上z坐标就是窗口坐标(window coordinate)。

x、y会被缩放到(x1, y1)和(x2,y2)范围,而z坐标不变。这样转换后的x、y、z会被送往光栅化阶段。

(x1,y1)和(x2,y2)是像素坐标了,但像素坐标是整数,浮点数转换到整数有个取整问题。一般认为像素中心是在0.5的地方,例如假设(x1,y1)和(x2,y2)不小于0,那么最左像素的左边界是0,中心是0.5,右边界是1。

Rasterizer阶段

细分:

triangle setup

准备三角形数据阶段。硬件实现。

triangle traversal

首先这里出现了一个fragment的概念:fragment是指被光栅化阶段的三角形覆盖(全覆盖或部分覆盖)到的像素格子其中之一。

找出每个三角形的fragments,就叫triangle traversal,或叫scan conversion。

也是硬件实现。

pixel shading

这个众所周知了不做介绍。

merging

就是把pixel shading的输出合并到color buffer。

这个阶段不可编程,但可以配置。

其中要注意,depth test和stencil test发生在这个阶段。

资料

偶然google到了2份很不错的管线图:

(来源:http://www.g-truc.net/post-0637.html#menu )

https://blog.csdn.net/wenzhilu/article/details/72356320

(未经授权禁止转载)
Written on August 5, 2018

写作不易,您的支持是我写作的动力!