初识webGL|青训营笔记

151 阅读3分钟

初识webGL|青训营笔记

这是我参加【第五届青训营】笔记创作活动的第13天

今天来学习WebGL的一些基本知识,首先我们要知道的是WebGL是什么?Why WebGL/Why GPU?首先,GPU≠WebGL≠3D,他们三者之间是不同的。另外,WebGL为什么不像其他前端技术?这是因为它涉及到硬件底层的概念和原理

现代图形系统

image-20220813103112449.png CPU和GPU都是做计算,为什么要分开呢?

在这之前,先理解一下图形的绘制过程

image-20220813103619989.png 现代图形系统中,首先进行轮廓提取,对轮廓进行网格化;对于平面用三角网格,3d的面用各种网格方法,常用的也是三角网格;网格化之后,将网格的图源进行光栅化;光栅化之后将数据送到帧缓存中,读取帧缓存的内容进行图形渲染。

数据处理成光栅或者像素的阵列,这个过程叫做渲染管线。

image-20220813103641326.png

CPU vs GPU

image-20220813104430096.png CPU可以理解为处理能力强大的处理单元,像一个管道处理数据,一个管道对应CPU的一个核,内核越多,同时能处理的任务越多。当处理图形渲染的任务时,像素的个数很多,同时处理48万个盒子,效率低;

image-20220813104834478.png

所以更换GPU,GPU由大量的小运算单元构成,每个运算单元只负责处理很简单的计算,每个运算单元彼此独立,因此所有计算可以并行处理。

WebGL & OpenGL

image-20220813104931581.png

WebGL是OpenGL的子集,它是OpenGL在浏览器端(Web)上的实现。OpenGL家族有很多,嵌入式设备中有一个OpenGL ES的版本,有一个对应的在web上的版本,叫WebGL.

WebGL Startup

  • 创建WebGL上下文;
  • 创建WebGL Program;
  • 将数据存入缓冲区;
  • 将缓冲区数据读取到GPU;
  • GPU执行WebGL程序,输出结果。

image-20220813105550824.png

Create WebGL Context

创建WebGL上下文

image-20220813105642664.png

考虑老一些浏览器的兼容性,需要用下面的代码

The Shaders

写着色器

1.顶点着色器:处理图形的轮廓;

2.片段着色器:光栅化之后,将像素点映射到片段着色器中,用片源折射器处理颜色。

image-20220813105950678.png

Greate Program

image-20220813110113348.png

创建顶点着色器,然后编译;创建片段着色器,然后编译;创建WebGL Program,将两个着色器通过attachshader的方式关联,然后将program link到webgl的上下文,然后用webgl的useprogram处理要渲染的图像。

Date to Frame Buffer

image-20220813110149195.png

Frame Buffer to GPU

image-20220813112104512.png

Output

image-20220813112222103.png

WebGL

image-20220813112252229.png

Mesh.js

绘制多边形在2d很简单,但在WebGL很难,因此可以用mesh.js封装来绘制多边形。

image-20220813112327431.png

Polygons

image-20220813112345320.png

Draw Polygon with 2D Triangulations

image-20220813112439435.png

3D Meshing

image-20220813112500438.png

Transforms

image-20220813112524256.png

image-20220813112534871.png

Apply Transforms

应用线性变换

image-20220813112600448.png

3D Matrix

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

  • 投影矩阵Projection Matrix;
  • 模型矩阵Model Matrix;
  • 视图矩阵View Matrix;
  • 法向量矩阵Normal Matrix.

read more

  • The book of shaders;

  • Mesh.js;

  • glsl-doodle;

  • SpriteJS;

  • ThreeJS;

  • ShaderToy