Ogl Step9 插值
背景
这节主要演示3D管道的重要部分————插值是光栅化处理程序处理从顶点缓冲区取出来的变量。正如你所看到的,为了能在屏幕上显示,你需要指明VS的输出变量是’gl_Position’. 这是一个4维的向量包含着顶点的齐次坐标。向量的XYZ分量除以W分量(透视分割),XY分量超出范围[-1,1]的Z分量超出[0,1]的都将被裁剪。结果被转换到屏幕空间坐标,然后几何图元通过光栅化程序被渲染到屏幕上。光栅化程序在三角形的三个顶点间进行插值,然后访问每一个在三角形内的像素执行片段着色器进行处理。 片段着色器返回一个颜色缓冲区中的像素颜色。如果片段着色器没处理该变量那么驱动器会进行优化,放弃VS中影响该变量的指令(在这种情况下着色程序会合并VS和FS)
两个非常常见的依赖于插值的变量是三角形的法线和纹理坐标。顶点的法线会在所有包含这个顶点的三角形中法线计算一个平均值。 如果对象不是完全平滑的那就意味着每个三角形的三个顶点的法线是各不相同的。 法线用于光照计算产生更真实的光照影响。纹理坐标也是相似的。这些纹理是模型的一部分有每个顶点指定。 为了用纹理覆盖三角形,需要对每个像素进行采样操作。为么个像素选择正确的纹理坐标。这些坐标是由插值产生的。
在这一节我们会看到使用插值产生不同的颜色覆盖三角形的表面。 由于我很懒,我们直接在VS里产生颜色。一个更乏味的方法是从顶点缓冲区中提供。一般你不会通过顶点缓冲区提供,你会提供一个纹理坐标然后从纹理中采样一个颜色。这个颜色在后面会进行光照计算。
代码漫游
1
|
|
在管道之间传输的参数要声明为’out’,在着色器中定义为全局变量。这个颜色是一个4-vector,XYZ分量代表RGB值,W分量代表alpha值。
1
|
|
颜色在图形管道中通常用范围为[0.0, 1.0]的浮点数进行表示。该值随后会被映射到0~255的颜色通道上。我们设置顶点的位置作为颜色值。首先我们使用内建的函数clamp();确保值在0.0-1.0的范围内。这是因为三角形的左下角的点位于(-1,-1),且小于等于0的值都会被渲染为黑色。这样的话左下角的角都会是黑色的。我们通过夹紧使得左下角的颜色值大于0.
clamp函数并不会改变向量的维数,智慧改变它的值。但我们输出的变量是4-vector的形式。所以我们使用GLSL的符号’vec4(vec3,W)‘来创建一个4-vector包含了3-vector并增加了一个w值。
1
|
|
VS输出的变量,在FS中接受输入的变量。因为这个变量会被光栅化程序进行插值处理,所以每一个FS会对应一个不同的颜色值。
1
|
|
我们使用插值的颜色作为片段的颜色。