调用drawarrays渲染三角形必须严格使用gl.triangles(4)、first=0、count为3的倍数,且需前置完成缓冲区绑定、顶点数据上传、attribute关联与启用、viewport设置及clear操作,任一环节缺失都将导致渲染失败。

drawArrays 参数顺序和 mode 值必须严格匹配三角形图元类型
调用 drawArrays 渲染三角形,核心是传对三个参数:mode、first、count。其中 mode 必须是 gl.TRIANGLES(值为 4),不能误用 gl.TRIANGLE_STRIP 或 gl.TRIANGLE_FAN —— 否则顶点会被按不同规则连接,画面完全错乱。
常见错误现象:只看到一个孤立顶点、一条线段,或图形严重扭曲。这往往是因为 mode 写成了 gl.LINES(1)或 gl.POINTS(0),而非 gl.TRIANGLES。
-
first是起始顶点索引(从 0 开始),通常填0 -
count必须是 3 的倍数,因为每个三角形需要 3 个顶点;若传入 4,WebGL 只取前 3 个顶点画一个三角形,第 4 个被忽略 - 完整调用示例:
gl.drawArrays(gl.TRIANGLES, 0, 3)—— 表示用顶点缓冲区中前 3 个顶点画一个三角形
顶点数据必须通过绑定的 ARRAY_BUFFER 上传且启用 attribute
仅调用 drawArrays 不会自动读取任意内存数据。顶点坐标得先写入 ARRAY_BUFFER,再通过 vertexAttribPointer 关联到着色器中的 attribute 变量,并显式启用该 attribute。
容易踩的坑:忘记调用 gl.enableVertexAttribArray(location),结果渲染出全黑或空白——GPU 根本没读取你的顶点数据。
- 必须在调用
drawArrays前完成:bindBuffer→bufferData→vertexAttribPointer→enableVertexAttribArray -
vertexAttribPointer的size参数要与着色器中vec2/vec3匹配(如 2D 坐标填2,3D 填3) - 若顶点数据是
Float32Array,type必须是gl.FLOAT;类型不匹配会导致坐标全为 0
着色器中 attribute 变量名必须与 JavaScript 中 getAttribLocation 一致
getAttribLocation 返回的 location 值用于 vertexAttribPointer 和 enableVertexAttribArray。如果变量名拼错、大小写不对,或着色器未实际使用该 attribute(比如声明了但没赋给 gl_Position),location 会返回 -1,后续操作全部失效。
典型错误信息不会直接报错,而是静默失败——你得手动检查:console.log(location) 是否为 -1。
- 确保顶点着色器里有类似
attribute vec2 a_position;,且下一行用了它:gl_Position = vec4(a_position, 0.0, 1.0); - JavaScript 中获取 location 必须在
linkProgram成功后:const loc = gl.getAttribLocation(program, 'a_position'); - 不要硬编码 location 值(如
0),不同驱动/浏览器可能重排 attribute 绑定顺序
viewport 和 clear 配置影响是否能看见三角形
即使 drawArrays 执行成功,若 gl.viewport 尺寸为 0 或未设,或 gl.clearColor + gl.clear 漏掉,也可能导致画面无响应、颜色残留、三角形被裁剪到视野外。
特别注意:gl.viewport 的宽高必须与 canvas 实际像素尺寸一致(不是 CSS 显示尺寸)。用 canvas.width/canvas.height,别用 canvas.style.width。
- 每次 canvas 大小变化后,必须重新调用
gl.viewport(0, 0, canvas.width, canvas.height) - 在
drawArrays前加gl.clear(gl.COLOR_BUFFER_BIT),否则上一帧残留会覆盖新图形 - 顶点坐标范围默认是标准化设备坐标(NDC):x/y ∈ [−1, 1]。若传入
[0, 0, 1, 1, 2, 2]这种超限数据,三角形会被裁剪掉,看起来像没画出来
drawArrays 这一行代码本身,而在于它前面那七八步有没有全做对——少一步,就白忙活。尤其是 attribute 启用、location 获取、viewport 设置这三个环节,最容易被当成“次要步骤”跳过。前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











