WebGL 与动画实现| 青训营笔记

112 阅读3分钟

这是我参与「第四届青训营 」笔记创作活动的的第14天

Webgl是什么?

WebGL(全写Web Graphics Library)是一种3D绘图协议,这种绘图技术标准允许把JavaScript和OpenGL ES 2.0结合在一起,通过增加OpenGL ES 2.0的一个JavaScript绑定,WebGL可以为HTML5 Canvas提供硬件3D加速渲染,这样Web开发人员就可以借助系统显卡来在浏览器里更流畅地展示3D场景和模型了,还能创建复杂的导航和数据视觉化。显然,WebGL技术标准免去了开发网页专用渲染插件的麻烦,可被用于创建具有复杂3D结构的网站页面,甚至可以用来设计3D网页游戏等等。

Modern Graphics System

  • 光栅 (Raster):几乎所有的现代图形系统都是基于光栅来绘制图形的,光栅就是指构成图像的像素阵列。

  • 像素(Pixel):一个像素对应图像上的一个点,它通常保存图像上的某个具体位置的颜色等信息。

  • 帧缓存 (Frame Buffer):在绘图过程中,像素信息被存放于帧缓存中,帧缓存是一块内存地址,

  • CPU (Central Processing Unit ):中央处理单元,负责逻辑计算。

  • GPU (Graphics Processing Unit ):图形处理单元,负责图形计算 步骤

  1. 轮廓提取 / meshing
  2. 光栅化
  3. 帧缓存
  4. 渲染

WebGL & OpenGl

OpenGL, OpenGL ES, WebGL, GLSL, GLSL ES API Tables (umich.edu)

WebGL Startup

  1. 创建 WebGL 上下文
  2. 创建 WebGL Program
  3. 将数据存入缓冲区
  4. 将缓冲区数据读取到 GPU
  5. GPU执行 webGL 程序,输出结果

创建WebGL Program

  • 顶点着色器 Vertex Shader : 用于处理顶点的位置
  • 片元着色器 Fragment Shader: 并行处理顶点包围内的所有像素,处理次数更多。颜色取值 从 0.0 - 1.0 的浮点范围。
  • 用浮点类型数组表示顶点数据,创建buffer后将返回的bufferid绑定到上下文

大致步骤

  • 创建WebGL Program
  • 将数据存入缓冲区Frame Buffer
  • 将缓冲区数据读取到GPU Buffer to GPU
  • GPU执行WebGL程序,输出结果 Output

坐标系知识

坐标系知识:canvas和浏览器的坐标轴都是左上角为原点。但WebGL的坐标体系,是一个以绘制画布的中心为原点,范围从 -1 到 1。在3D的情况下,z轴正方向是向外的。

其他方式绘图

  • 使用 canvas 2D
  • 使用mesh.js的开源库
  • 其他图形(Polygons)的绘制

方法:三角剖分

  • 使用3D Meshing

步骤:

  1. 设计软件设计模型
  2. 提取所有的顶点数据
  3. 渲染

图形的变换

平移

x=x0+x1x = x0 + x1x=x0+x1

y=y0+y1y = y0 + y1y=y0+y1

旋转

x=x0∗cos()+y0sin()x=x0*cos()+y0sin()x=x0∗cos()+y0sin()

y=x0∗sin()+y0∗cos()y=x0sin()+y0cos()y=x0∗sin()+y0∗cos()

缩放

x=Sx∗x0x=Sx*x0x=Sx∗x0

y=Sy∗y0y=Sy*y0y=Sy∗y0

旋转+缩放是线性变换

3D Matrix

3D 标准模型的四个齐次矩阵 (mat4)

  1. 投影矩阵 Proiection Matrix
  2. 模型矩阵 Model Matrix
  3. 视图矩阵 View Matrix
  4. 法向量矩阵 Normal Matrix

扩展阅读

The Book of Shaders

mesh-js/mesh.js: A graphics system born for visualization 😘. (github.com)

Glsl Doodle (webgl.group)

SpriteJS ~ Next - 下一代 SpriteJS

Three.js – JavaScript 3D Library (threejs.org)

Shadertoy BETA