在定义了中等精度的浮点值之后,我们把储存有平滑的混合颜色并经过线性插值运算的Varying变量VColor,直接立即作为颜色返回给片元着色器。
这就是本节课与上节课的主要不同点。另外还有两个不同的地方。第一个变化非常小,在initShaders函数中,我们引用了2个属性值(Attribute)而不是1个,请参考下面的代码中的第107行和第108行。
87 var shaderProgram;
88
89 function initShaders() {
90 var fragmentShader = getShader(gl, "shader-fs");
148 gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(colors), gl.STATIC_DRAW);
149 triangleVertexColorBuffer.itemSize = 4;
150 triangleVertexColorBuffer.numItems = 3;
我们用列表的形式给每个顶点赋予颜色值,就像位置信息一样。然而,在两个数组对象之间有一个很有意思的区别,每个位置信息只需要3个数字,分别代表X轴、Y轴和Z轴的坐标,但每个颜色信息需要4个数字,分辨代表红、绿、蓝和透明度(R, G, B and Alpha)。透明度的意思就是颜色的透明程度(0代表完全透明,1代表完全不透明),我们在以后的课程中会经常用到它。这个在数组成员数量上的改变,同样也需要反映到我们建立的用来描述它们的itemSize上。
下面,我们用类似的代码来绘制矩形。这一次,因为是一个纯色的矩形,所以我们要为每个顶点赋予相同的颜色值,我们使用一个循环来实现,请看代码中的第165行到第173行的部分。
153 squareVertexPositionBuffer = gl.createBuffer();