前言
因为计算机图形学课程作业的需要,我在使用过 OpenGL 的基础上学习了使用 WebGL 进行二维图形渲染。
WebGL 拥有与 OpenGL ES 相似的 API(前者基于后者),但与 OpenGL 相比,两者缺少基础图形的渲染管线,而是需要手写 shader 进行渲染。
基础
请阅读 WebGL Fundamentals 以获得对于 WebGL 的大体了解。
Shader
在 WebGL 中需要两种 shader 进行渲染。第一种是 vertex shader,负责对顶点进行变换,例如将像素坐标映射到 clip space。而第二种是 fragment shader,负责对像素点进行着色。
Shader 可以有两种参数。第一种是 attribute,在每次调用中不同,例如当前顶点的位置;第二种是 uniform,在渲染过程中共享,例如渲染的变换矩阵。
以下是两个实用的简单 2D shader:
Vertex shader:
1 | attribute vec2 a_position; |
Fragment shader:
1 | precision mediump float; |
初始化
以下是我的一些工具函数,参考了 WebGL Boilerplate 和一部分 WebGL - Less Code, More Fun:
1 | function createAndCompileShader(gl, id) { |
提供数据
以下是我自己写作的一些工具函数:
1 | /** |
变换矩阵
以下代码参考了 WebGL 2D Translation 和 WebGL Orthographic 3D。需要注意的是,原教程的代码中有部分矩阵错误地以行优先而非列有限的方式进行表示或运算。
1 | function makeIdentityMatrix() { |
近似于 OpenGL 的 API 封装
1 | var _gl = null; |
绘制和应对大小改变
以下代码参考了 WebGL Resizing the Canvas 和 WebGL Anti-Patterns。
1 | function draw(gl) { |
结语
作为一个复杂度适中的示例,我的作业代码可以在 这里 看到。