webgl 笔记

311 阅读2分钟

webgl 在浏览器中的执行流程

缓冲区

gl.COLOR_BUFFER_BIT // 颜色缓冲区

gl.DEPTH_BUFFER_BIT // 深度缓冲区

gl.STENCIL_BUFFER_BIT // 模板缓冲区

着色器

1. 颜色着色器

2. 片元着色器

attribute 、 uniform、varying

  • attribute: 只存在顶点着色器,实时改变的,通常用于存放顶点数据、颜色值。类型只能为 float,vec2,vec3,vec4,mat2,mat3,mat4
  • uniform: 顶点着色器、片元着色器都存在。一次渲染过程不变。
  • varying:可以将顶点着色器传递给片元着色器,只接受 float,vec2,vec3,vec4,mat2,mat3,mat4。

绘制

// 顶点着色器绘制图形

gl.drawArrays(mode, first<number>, count<number>)

// mode 绘制方式,包括 gl.POINTS gl.LINES gl.LINE_STRIP gl.LINE_LOOP gl.TRIANGLES gl.TRIANGLE_STRIP gl.TRIANGLE_FAN

// first 从哪个顶点开始绘制

// count 绘制需要用到几个顶点

顶点着色器顶点数据存入缓冲区对象步骤

// 1. 创建缓冲区
gl.createBuffer()

// 2. 将缓冲区对象绑定到 target 上
// target gl.ARRAY_BUFFER 缓冲区对象包含顶点数据;gl.ELEMENT_ARRAY_BUFFER 缓冲区对象包含顶点的索引值
// buffer gl.createBuffer() 的返回值
gl.bindBuffer(target, buffer)

// 3. 将数据写入缓冲区
// target gl.ARRAY_BUFFER gl.ELEMENT_ARRAY_BUFFER
// data 写入的数据 Float32Array
// usage 表示程序如何使用存储在缓冲区的数据,传入错误的值不会报错,只是不会优化。gl.STATIC_DRAW 只向缓冲区写入一次数据,但需要绘制很多次;gl.STREAM_DRAW 只写入一次数据,然后绘制若干次 gl.DYNAMIC_DRAW 多次写入,并绘制多次
gl.bufferData(target, data, usage)

// 4. 将缓冲区对象分配给一个 attribute 变量
// location 指定待分配 attribute 变量的存储位置
// size 指定缓冲区中每个顶点的分量个数(1到4)
// type 数据类型 gl.UNSIGNED_BYTE => Uint8Array
// normalize true | false 是否将非浮点数的数据归化到 [0, 1] | [-1, 1] 区间
// stride 相邻两个顶点间的字节数
// offset 指定缓冲区中的偏移量
gl.vertexAttribPointer(location, size, type, normalize, stride, offset)

// 5. 开启缓冲区变量
gl.enableVertexAttribArray()

顶点着色器 => 片元着色器

  1. 图形装配过程:将孤立的顶点坐标装配成几何图形。几何图形的类别由 gl.drawArrays() 函数第一个参数决定。
  2. 将装配好的几何图形转化为片元

varying 变量内插