WebGL基础
【第二届青训营-寒假前端场】- 「WebGL基础」,这节课老师非常详尽的讲解了WebGL的绘图及其相关库,展示了很多有意思的WebGL小项目
最后更新于
【第二届青训营-寒假前端场】- 「WebGL基础」,这节课老师非常详尽的讲解了WebGL的绘图及其相关库,展示了很多有意思的WebGL小项目
最后更新于
WebGL是什么?
GPU ≠ WebGL ≠ 3D
WebGL为什么不像其他前端技术那么简单?
光栅(Raster):几乎所有的现代图形系统都是基于光栅来绘制图形的,光栅就是指构成图像的像素阵列。
像素(Pixel):一个像素对应图像上的一个点,它通常保存图像上的某个具体位置的颜色等信息。
帧缓存(Frame Buffer):在绘图过程中,像素信息被存放于帧缓存中,帧缓存是一块内存地址。
CPU (Central Processing Unit):中央处理单元,负责逻辑计算。
GPU (Graphics Processing Unit):图形处理单元,负责图形计算。
如上图,现代图像的渲染如图过程
轮廓提取/ meshing
光栅化
帧缓存
渲染
GPU由大量的小运算单元构成
每个运算单元只负责处理很简单的计算
每个运算单元彼此独立
因此所有计算可以并行处理
OpenGL, OpenGL ES, WebGL, GLSL, GLSL ES API Tables (umich.edu)
步骤
创建WebGL上下文
创建WebGL Program
将数据存入缓冲区
将缓冲区数据读取到GPU
GPU执行WebGL程序,输出结果
如图,针对几个单词进行解释:
Raw Vertices & Primitives 原始顶点&原语
Vertex Processor 顶点着色器
运算后送到 片元着色器 进行处理:Fragment Processor
Vertex Shader(顶点着色器)
通过类型数组position,并行处理每个顶点的位置
Fragment Shader(片元着色器)
为顶点轮廓包围的区域内所有像素进行着色
其具体步骤如下:
创建顶点着色器和片元着色器代码:
使用 createShader()
创建着色器对象
使用 shaderSource()
设置着色器的程序代码
使用 compileShader()
编译一个着色器
使用**createProgram()
** 创建 WebGLProgram
对象
使用 attachShader()
往 WebGLProgram
添加一个片段或者顶点着色器。
使用 **linkProgram()
**链接给定的WebGLProgram
,从而完成为程序的片元和顶点着色器准备GPU代码的过程。
使用 useProgram()
将定义好的WebGLProgram
对象添加到当前的渲染状态
坐标轴:webGL的坐标系统是归一化的,浏览器和canvas2D的坐标系统是以左上角为坐标原点,y轴向下,x轴向右,坐标值相对于原点。而webGL的坐标系是以绘制画布的中心点为原点,正常的笛卡尔坐标系。
通过一个顶点数组表示其顶点,使用 createBuffer()
创建并初始化一个用于储存顶点数据或着色数据的WebGLBuffer
对象并返回bufferId
,然后使用 bindBuffer()
将给定的 bufferId
绑定到目标并返回,最后使用**bufferData()
**,将数据绑定至buffer中。
getAttribLocation() 返回了给定
WebGLProgram
对象中某属性的下标指向位置。vertexAttribPointer() 告诉显卡从当前绑定的缓冲区(bindBuffer()指定的缓冲区)中读取顶点数据。
enableVertexAttribArray() 可以打开属性数组列表中指定索引处的通用顶点属性数组。
drawArrays() 从向量数组中绘制图元
看看人家canvas2D,绘制同样的三角形:
mesh-js/mesh.js: A graphics system born for visualization 😘. (github.com)
使用Earcut进行三角剖分
由设计师导出给我们,再提取
SpriteJS/next - The next generation of spritejs.
这就是数字图像处理相关的知识了(学过的都还回来了.jpg)
从线性变换到齐次矩阵
老师的又一个栗子:Apply Transforms
3D标准模型的四个齐次矩阵(mat4)
投影矩阵Projection Matrix(正交投影和透视投影)
模型矩阵Model Matrix (对顶点进行变换Transform)
视图矩阵View Matrix(3D的视角,想象成一个相机,在相机的视口下)
法向量矩阵Normal Matrix(垂直于物体表面的法向量,通常用于计算物体光照)
The Book of Shaders (介绍片元着色器,非常好玩的)
Mesh.js (底层库,欸嘿)
Glsl Doodle (片元着色器的一个轻量库,有很多小demo)
SpriteJS (月影老师写的开源库orz)
Three.js(很多有意思的游戏项目)
Shadertoy BETA(很多有意思的项目)
这节课老师非常详尽的讲解了WebGL的绘图及其相关库,展示了很多有意思的WebGL小项目~
本文引用的大部分内容来自月影老师的课和MDN!月影老师,tql!