<aside> 💡

基本概念

</aside>

首先了解我们要解决的问题是什么:

我们从一个比较传统的OpenGL渲染管线出发,思考一下到底是其中的哪些步骤 不可微 。

image.png

  1. 顶点着色器:对顶点进行各类操作,包括平移、缩放、旋转和投影,本质上都是矩阵乘法,均是线性操作,所以天然可微。
  2. 图元装配:把顶点装配成不同的几何结构(三角形、线段等)
  3. 几何着色器:可选阶段,一般用于产生新图元或做LOD操作。
  4. 光栅化:通过将3d模型的图元(如线段、三角形)映射到2d像素网格,对每个像素的采样和插值来确定像素的颜色。由于这是一个离散的过程,光栅化步骤不是在连续的参数空间上操作,因此 不具备可微性 。
  5. 片段着色器:首先找到片段所在的三角形并计算片段中心的重心坐标, 通过重心插值把顶点的属性赋给每个片段。对许多常用模型来说都是可微的,但也可能会包含不可微的部分。
  6. 测试与混合操作,包括深度测试、模板测试和颜色混合等。这些操作都是非线性操作,求导很困难,因此通常被认为是 不可微 的。

可以发现只有4、6中包含有必定不可微的部分。基于光栅化的可微渲染也是解决这两个问题为主