WebGL从零开始(二)——面

3/10/2026 WebGL

# 前言

上一篇,绘制了点、线,还差一个面,就构成基础绘制了,那么这次就看看WebGL中面是如何绘制的吧。

# 一、面

在WebGL中,所有的面都是由三角形组成的,一个三角形就是最基础的面。

# 1. 绘制方向——面的正反

面向我们的面,如果是正面,则绘制顺序是逆时针。

面向我们的面, 如果是反面, 则绘制顺序是顺时针。

# 2. 面的类型

有三种:

  • 独立的三角面:gl.TRIANGLES
  • 三角带:gl.TRIANGLE_STRIP
  • 三角扇:gl.TRIANGLE_FAN

# 2.1 三角面

Three.js 中面就是用的独立三角面来绘制的。

// 创建canvas、webgl、初始化省略

// 缓冲区 及绑定
const pointBuffer = gl.createBuffer()
gl.bindBuffer(gl.ARRAY_BUFFER, pointBuffer)
const points = new Float32Array([
    0.2,0.2,
    -0.2,0,
    0,0.2,
    0.2,0,
    0,-0.2,
    -0.2,-0.2
])
gl.bufferData(gl.ARRAY_BUFFER, points, gl.STATIC_DRAW)

const a_Position = gl.getAttribLocation(gl.program, 'a_Position')    
// 修改顶点数据
gl.vertexAttribPointer(a_Position, 2, gl.FLOAT, false, 0, 0)
// 开启对应属性
gl.enableVertexAttribArray(a_Position)

gl.clearColor(0,0,0,1)
gl.clear(gl.COLOR_BUFFER_BIT)
// 注意 count 为6 是因为 points 是6个 x,y  2个三角形
gl.drawArrays(gl.TRIANGLES, 0, 6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

效果图:

# 2.2 三角带

绘制三角带需要注意下,是有顺序的:

第一个三角形: 以前3个点绘制, v1->v2 第一条边, v2->v3 第二条边, v3->v1 第三条边

第二个三角形: 以第一个三角形的第二条边为基础逆序绘制+第四个点, v3->v2, v2->v4, v4->v3

第三个三角形: 以上一个三角形的第三条边为基础逆序绘制+第5个点, v3->v4, v4->5, v5->v3

第偶数个三角形: 以上一个三角形的第二条边为基础逆序绘制+下一个点

第奇数个三角形: 以上一个三角形的第三条边为基础逆序绘制+下一个点

以上面独立三角形的顶点为例:

// 绘制三角带
gl.drawArrays(gl.TRIANGLE_STRIP, 0, 6)
1
2

效果图:

绘制顺序如图:

第一个三角形:v1->v2->v3

第二个三角形:v3->v2->v4

第三个三角形:v3->v4->v5

第四个三角形:v5->v4->v6

# 2.3 三角扇

以第一个为原点,每次取2个与之组合成三角形

// 绘制三角扇
gl.drawArrays(gl.TRIANGLE_FAN, 0, 6)
1
2

绘制顺序:都是以v1为起点,第一个三角形是 v1-> v2->v3

第二个三角形是 v1->v3-v4

第三个是 v1->v4->v5

第四个是 v1->v5->v6

image-20260723220335375

Last Updated: 9/16/2026, 9:23:32 AM