渲染流水线详解 |《GPU编程与CG语言》笔记(一)

2020-07-01  本文已影响0人  温素年

最近几天看了《GPU编程与CG语言之阳春白雪下里巴人》这本书,书的内容和之前看的《Unity Shader入门精要》很相似,但是侧重点有所不同。因此,下面的三篇文章是在阅读《GPU》之后,结合之前一本书的内容,做一些更深入的理解或逻辑的理顺。


这一篇文章是对渲染流水线的知识做一下进一步理解。老生常谈地,渲染流水线分为应用阶段、几何阶段、光栅化阶段。

应用阶段

主要使用高级语言,在应用层面准备数据。本书中举例如碰撞检测、场景图建立、空间八叉树更新、视锥裁剪等。

我理解的是:我们在Unity的shader文件中声明了变量(例如vertex、normal等),应用阶段是在这些变量被传到shader之前做的事情。

几何阶段

包括顶点坐标变换、光照、裁剪、投影、屏幕映射等操作。

顶点坐标变换

顶点坐标变换就是《Unity》一书第四章中的几个坐标系之间的转换。其余的几个步骤其实包含在顶点坐标变换的过程中。

图元装配

上述变换都是对顶点的操作,在这一步骤中,我们根据顶点坐标和索引构建出三角形网格。

这一阶段结束后,我们得到了一些三角形面片用于下一步的光栅化。

光栅化阶段

像素位置计算

将顶点的屏幕坐标转换为像素位置,并使用一定的算法计算出每一条线(三角形设置)和面(三角形遍历)占用的像素位置。

像素颜色计算

  1. 深度/模版检测
  2. 纹理
  3. 混合(Blending)

深度缓冲(Z-buffer)

Z-buffer中储存的z值并不是欧氏距离,而是一个相对的值。我们只储存了顶点的z值,内部像素点的z值需要通过插值获得,而得到的z值并不能反应真实的空间点的深度关系,有可能获得错误的结果。

如下图所示,A、E是顶点,B、C、D为真实的深度,而B'、C'、D'为插值计算出来的深度。


Tips:
坐标变换时旋转、缩放、平移的顺序:
--缩放变换不改变坐标轴的走向,也不改变原点的位置,所以两个坐标系仍然重合。
--旋转变换改变坐标轴的走向,但不改变原点的位置,所以两个坐标系坐标轴不再处于相同走向。
--平移变换不改变坐标轴走向,但改变原点位置,两个坐标系原点不再重合。
因此,变换顺序只能是 缩放 -> 旋转 -> 平移 。


图片来自 东隆咚
上一篇下一篇

猜你喜欢

热点阅读