这是对MIT Foundation of 3D Computer Graphics第13章的翻译,本章讲解了变异变量(varying variables)正确线性插值的实现原理。本书内容仍在不断的学习中,因此本文内容会不断的改进。若有任何建议,请不吝赐教ninetymiles@icloud.com。
注:文章中相关内容归原作者所有,翻译内容仅供学习参考。
另:Github项目CGLearning中拥有相关翻译的完整资料、内容整理、课程项目实现。
变异变量(Varying Variables)- 较难理解
为了表示跨越一个三角形的函数,在图形管线中从一个三角形顶点进行到这个三角形内的每个像素的阶段中,我们需要插值变异变量(varying variables)。本章中,我们探索这种插值如何被正确完成。令人吃惊地,这种看似寻常的步骤实际上是有点儿复杂的。阅读本章之前,你应该熟悉附录B中的材料内容。
13.1 解决问题的动机(Motivating The Problem)
在之前的图示
如果我们以正交的方式观察这个立方体面,那么我们窗口的合适部分应该看起来就像是原始的棋盘图像。如果这个面以某种角度远离我们,正如图示
OpenGL是如何获得这种正确图像呢?假设我们尝试在屏幕上通过简单线性插值以确定出像素上的

Figure 13.1: 被映射到立方体面上的棋盘图片的正确图案。

Figure 13.2: 当纹理坐标在窗口坐标(window coordinates)上被线性插值,一个不正确的图形渲染产生了。
13.2 合理线性插值(Rational Linear Interpolation)
出现刚才描述的问题是因为我们想要的函数(本例中为纹理坐标)并不是屏幕变量
要指出插值这种数据的正确方式,让我们推理如下:
回忆这种情形,假定给出我们模型视图矩阵(model view matrix)
反转我们的矩阵,这会暗示对于三角形上的每个点,我们有下列关系:
现在假设
从而:
上面方程式针对某种合适的值
现在两边除以
这告诉我们
标准化设备坐标(normalzied device coordinates)通过一个矩阵乘法(而不是除法)和窗口坐标(windows coordinates)关联,利用这个事实,我们可以借助小节B.5的推理推断出
最后,因为我们始于一个三角形,这个三角形在物体坐标上是平面的,那么我们也是在窗口坐标上处理平面物体。如此,假设这个三角形在窗口中有非零的投射区域,我们可以应用小节B.4的推理移除对
现在我们来看一下OpenGL是如何执行正确的插值来计算每个像素的
- 顶点着色器(vertex shader)运行在每个顶点上,计算出裁切坐标和针对每个顶点的变异变量(varying variables)。
- 裁切过程运行在每个三角形之上;这个过程可能生成新的顶点。在裁切坐标空间(clip coordinate space)运行线性插值来确定每个新顶点的裁切坐标和变异变量(varying variables)值。
- 针对每个顶点,和每个变异变量(varying variables)
,OpenGL生成一个内部变量(internal variable)
。另外,针对每个顶点OpenGL单独生成一个内部变量
。
- 针对每个顶点,除法被执行以获得标准化设备坐标(normalized device coordinates)。
- 针对每个顶点,标准化设备坐标(normalized device coordinates)被变换为窗口坐标(window coordinate)。
-
坐标被用于在屏幕上定位三角形。
- 针对三角形的每个内部像素,线性插值被执行以获得被插值的
,
(针对所有的
)和
。
- 在每个像素上,被插值的
值被用于z-buffering(深度缓存操作)。
- 在每个像素上,针对所有的变异变量(varying variables),除法在插值后的内部变量上被执行以获得正确答案
。
- 变异变量(varying variable)
被传递给碎片着色器(fragment shader)。
在图示

Figure 13.3: 这里我们展示了变异变量(varying variables)的处理如何适应渲染管线。