这里对程序进行,之所以为什么这样校验个人暂时也不太懂,只是 copy,估计应该便于我们开发人员进行调试吧。
gl.validateProgram(shaderProgram)
if(!gl.getProgramParameter(shaderProgram,gl.VALIDATE_STATUS)){
console.log("ERROR validating program ",gl.getProgramInfoLog(shaderProgram))
}
这里我们定义三角形的顶点坐标,我们回到看一下 attribute vec2 vertPosition; 所以我们的顶点坐标是二维的,所以每两个点定义一个坐标,然后这些坐标组成一个数组用来表示三角形,具体这里数值怎么来的,为什么是这个数值。随后分享
const triangleVertices = [
0.0,0.5,
-0.5,-0.5,
0.5,-0.5
];
- 首先为三角形创建一个位置的 buffer
- 然后为 buffer 指定类型
- 然后将我们三角形的顶点坐标给定buffer类型
- 这里有一点值得注意就是 javascript 的 triangleVertices 类型为 float64 而 webgl 需要 float32 所以我们需要转一下型
var triangleVertexBufferObject = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, triangleVertexBufferObject);
gl.bufferData(gl.ARRAY_BUFFER,
new Float32Array(triangleVertices),
gl.STATIC_DRAW);
这里我们定义属性这是需要传入 shader 进行计算的我们定义本地数据 vertPosition
var positionAttribLocation = gl.getAttribLocation(shaderProgram,'vertPosition')
vertexAttribPointer 这个函数接受 5 参数
- numComponents 表示我们坐标数这里是 2
- normalize 理解他需要一定做 3d 基础他是我们绘制面的法线,也就是垂直我们面的一条线
- stride 这里 2 * 4
- offset 表示数组中偏移量
const numComponents = 2;
const type = gl.FLOAT;
const normalize = gl.FALSE;
const stride = 2 * Float32Array.BYTES_PER_ELEMENT;
const offset = 0;
gl.vertexAttribPointer(
positionAttribLocation,
numComponents,
type,
normalize,
stride,
offset);
drawArrays 多半时候我们都是在绘制三角形,三角形是我们做动画的基础,有时候也会绘制点和线
gl.enableVertexAttribArray(
positionAttribLocation);
gl.useProgram(shaderProgram)
gl.drawArrays(gl.TRIANGLES,0,3)
网友评论