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

185 阅读2分钟

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

这是我参与「第四届青训营 」笔记创作活动的第15天 与大家分享WebGL与动画实现的基础知识,包括WebGL的介绍及实战,不足之处欢迎大家批评指正!

WebGL与GPU

  • WebGL是什么?

    GPU ≠ WebGL ≠ 3D

  • WebGL为什么不像其他前端技术那么简单?

Modern Graphics System

简介

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

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

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

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

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

image.png

作用

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

image.png

渲染:The Pipeline

渲染过程:Data -> Processor -> Frame buffer -> Pixels

image.png

CPU vs GPU

处理图形渲染的任务,同时处理大量像素的任务

  • CPU 一个处理单元内核

image.png

当遇到大量数据时:犹如管道遇到大量沙子,处理任务效率低 image.png

  • GPU 由大量小运算单元构成

每个运算单元只负责处理很简单的计算

每个运算单元彼此独立

因此所有计算可以并行处理

image.png

WebGL & OpenGL

web.eecs.umich.edu/~sugih/cour…

image.png

WebGL Startup

像素处理过程运行语言处理

过程:

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

image.png

步骤:

  1. Create Web GL Context

现代浏览器

image.png

旧版浏览器

image.png

  1. The Shaders

1️⃣ Vertex Shader

image.png

2️⃣ Fragment Shader

image.png

  1. Create Program

image.png

  1. Data to Frame Buffer

坐标系

Axes:轴 image.png

Typed Array

image.png

image.png

  1. Frame Buffer To GPU

image.png

image.png

2D vs WebGL

code.juejin.cn/pen/7119692…

  • 2D js
const canvas = document.querySelector('canvas');
const ctx = canvas.getContext('2d');

ctx.beginPath();
ctx.moveTo(250, 0);
ctx.lineTo(500, 500);
ctx.lineTo(0, 500);
ctx.fillStyle = 'red';
ctx.fill();
  • WebGL

mesh.js

import {Renderer, Figure2D, Mesh2D} from '@mesh.js/core';

const canvas = document.querySelector('canvas');
const renderer = new Renderer(canvas);

const figure = new Figure2D();
figure.beginPath();
figure.moveTo(250, 0);
figure.lineTo(500, 500);
figure.lineTo(0, 500);

const mesh = new Mesh2D(figure, canvas);
mesh.setFill({
  color: [1, 0, 0, 1],
});

renderer.drawMeshes([mesh]);

展示效果

image.png

Polygons

  • Polygons

image.png

  • Triangulations

image.png

Draw Polygon with 2D Triangulations

使用Earcut进行三角剖分

image.png

image.png

3D Meshing展示

写好模型再运行,一般不实时同步,规模大

image.png

Transforms变换

  • 利用数学知识进行变换

平移

image.png

旋转

image.png

缩放

image.png

旋转 + 缩放是线性变换

image.png

image.png

image.png

从线性变换到齐次矩阵

  • 变换应用

image.png

image.png

3D Matrix

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

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

推荐资料和工具:

  1. The book of shaders thebookofshaders.com/

  2. Mesh.js github.com/mesh-js/mes…

  3. glsl-doodle doodle.webgl.group/

  4. SpriteJS spritejs.com/#/

  5. ThreeJS threejs.org/

  6. Shadertoy www.shadertoy.com/