Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >WebGL基础笔记

WebGL基础笔记

作者头像
赤蓝紫
发布于 2023-01-02 08:59:10
发布于 2023-01-02 08:59:10
1.2K00
代码可运行
举报
文章被收录于专栏:clzclz
运行总次数:0
代码可运行

WebGL 基础笔记

个人参加字节跳动的青训营时写的笔记。这部分是月影老师讲的 WebGL 基础。

1. 简介

WebGL 代码有两部分:

  • 运行在 CPU 上的 JavaScript
  • 运行在 GPU 上的 GLSL

CPU 和 GPU

  • CPU 适合比较复杂的任务,不适合量大但每个单元比较简单的任务
  • GPU 有大量的小运算单元构成,每个运算单元只负责处理简单的计算,每个运算单元彼此独立。所有计算可以并行处理。适合量大但每个单元比较简单的任务。

图像的处理适合交给 GPU,因为图像会有很多的像素点需要处理。

2. 流程

这部分只能说似懂非懂(任重而道远啊),先贴一下课上的示例代码,方便之后看。

创建 WebGL 上下文

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const canvas = document.querySelector("canvas");
const gl = canvas.getContext("webgl");

创建 WebGL 程序(GLSL,顶点着色器、片元着色器)

顶点着色器(Vertex Shader):

片元着色器(Fragment Shader):顶点之间的轮廓中的所有像素都会经过片元着色器处理。(并行处理)

将数据存入缓冲区

将缓冲区数据读取到 GPU

GPU 执行 WebGL 程序,输出结果

完整代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 1. 创建WebGL上下文
const canvas = document.querySelector("canvas");
const gl = canvas.getContext("webgl");

// 2. 创建WebGL程序

// 2.1 顶点着色器
const vertex = `
  attribute vec2 position;

  void main() {
    gl_PointSize = 1.0;
    gl_Position = vec4(position, 1.0, 1.0);
  }
`;

// 2.2 片元着色器
const fragment = `
  precision mediump float;

  void main()
  {
    gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);	// 类似rgba
  }    
`;

// 2.3 加载、编译、使用着色器
const vertexShader = gl.createShader(gl.VERTEX_SHADER);
gl.shaderSource(vertexShader, vertex);
gl.compileShader(vertexShader);

const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);
gl.shaderSource(fragmentShader, fragment);
gl.compileShader(fragmentShader);

const program = gl.createProgram();
gl.attachShader(program, vertexShader);
gl.attachShader(program, fragmentShader);
gl.linkProgram(program);
gl.useProgram(program);

const points = new Float32Array([-1, -1, 0, 1, 1, -1]);

// 3. 将数据存入缓存区
const bufferId = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, bufferId);
gl.bufferData(gl.ARRAY_BUFFER, points, gl.STATIC_DRAW);

// 4. 将缓冲区数据读取到GPU
const vPosition = gl.getAttribLocation(program, "position");
gl.vertexAttribPointer(vPosition, 2, gl.FLOAT, false, 0, 0);
gl.enableVertexAttribArray(vPosition);

// 5. GPU执行WebGL程序
gl.clear(gl.COLOR_BUFFER_BIT);
gl.drawArrays(gl.TRIANGLES, 0, points.length / 2); // points中有六个点,实际上只有三个点,所以需要除以2

效果:

canvas 2D 版本:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 简单好多)

3. 多边形

多边形需要进行三角划分

Earcut

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 1. 创建WebGL上下文
const canvas = document.querySelector("canvas");
const gl = canvas.getContext("webgl");

// 2. 创建WebGL程序

// 2.1 顶点着色器
const vertex = `
  attribute vec2 position;

  void main() {
    gl_PointSize = 1.0;
    gl_Position = vec4(position, 1.0, 1.0);
  }
`;

// 2.2 片元着色器
const fragment = `
  precision mediump float;

  void main()
  {
    gl_FragColor = vec4(0.0, 1.0, 1.0, 1.0);
  }    
`;

// 2.3 加载、编译、使用着色器
const vertexShader = gl.createShader(gl.VERTEX_SHADER);
gl.shaderSource(vertexShader, vertex);
gl.compileShader(vertexShader);

const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);
gl.shaderSource(fragmentShader, fragment);
gl.compileShader(fragmentShader);

const program = gl.createProgram();
gl.attachShader(program, vertexShader);
gl.attachShader(program, fragmentShader);
gl.linkProgram(program);
gl.useProgram(program);

// 顶点集
const vertices = [
  [-1, -1],
  [-1, 0],
  [0, 0],
  [0, -1],
];

const points = vertices.flat(); // 点集
const triangles = earcut(points); // 三角形集(三角划分后的三角性)

const position = new Float32Array(points);
const cells = new Uint16Array(triangles);

// 3. 将数据存入缓存区,这时候需要分点和三角形来分别存
const pointBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, pointBuffer);
gl.bufferData(gl.ARRAY_BUFFER, position, gl.STATIC_DRAW);

const cellsBuffer = gl.createBuffer();
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, cellsBuffer);
gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, cells, gl.STATIC_DRAW);

// 4. 将缓冲区数据读取到GPU
const vPosition = gl.getAttribLocation(program, "position");
gl.vertexAttribPointer(vPosition, 2, gl.FLOAT, false, 0, 0);
gl.enableVertexAttribArray(vPosition);

// 5. GPU执行WebGL程序
gl.clear(gl.COLOR_BUFFER_BIT);
gl.drawElements(gl.TRIANGLES, cells.length, gl.UNSIGNED_SHORT, 0); // 这部分还不是很明白

效果:

4. 变换

  • 平移
  • 旋转
  • 缩放

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

  • 投影矩阵
  • 模型矩阵
  • 视图矩阵
  • 法向量矩阵

挖了个大坑

6. 相关链接

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-01-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
WebGL基础 - 笔记
光栅(Raster):几乎所有的现代图形系统都是基于光栅来绘制图形的,光栅就是指构成图像的像素阵列。
TagBug
2023/03/17
7980
WebGL基础 - 笔记
高冷的 WebGL
在上一篇文章中,我给大家分享了,如何能快速入门Threejs。Threejs是一个用于在浏览器中绘制3D图形的JS库,其底层实际是对浏览器提供的WebGL Api进行了封装。作为一个好奇宝宝,看到了T
周明礼
2017/05/17
5.4K0
高冷的 WebGL
【愚公系列】2023年08月 WEBGL专题-canvas和webgl的区别 | 技术创作特训营第一期
本文是专题类文章,主要是针对数字孪生和WEB 3D可视化展开,下面是数字孪生相关概念。
愚公搬代码
2023/08/27
7750
WebGL学习笔记 | 使用着色器绘制一个点
前一篇 《WebGL学习笔记 | 创建着色器程序》介绍了如何创建着色器程序,这次我们让着色器程序运行起来,并在屏幕上绘制一个点。
张晓衡
2019/09/11
9380
WebGL学习笔记 | 使用着色器绘制一个点
从关键概念开始,万字带你轻松入门 WebGL
只要理解了 WebGL 背后的概念,学习 WebGL 并没有那么难。很多 WebGL 入门文章并没有介绍这些重要的概念,直接使用 WebGL 复杂的 API 开始渲染图形,很轻松就把入坑文变成了劝退文。这篇文章将会着重讲解这些概念,并一步步探究 WebGL 是如何渲染图片到屏幕的,理解这些重要的概念,将会大大降低学习曲线。
羽月
2022/10/08
2.2K0
从关键概念开始,万字带你轻松入门 WebGL
【WebGL】初探WebGL,我了解到这些
WebGL基于OpenGL ES(嵌入式系统) 一种广泛用于在各种平台上渲染2D和3D图形的标准。它允许开发人员使用JavaScript与用户设备的GPU(图形处理单元)交互,实现硬件加速渲染。
且陶陶
2023/10/16
4760
【WebGL】初探WebGL,我了解到这些
可视化导学-图形基础
关于 HTML/CSS、SVG、Canvas2D 和 WebGL 这四种图形系统。
Cellinlab
2023/05/17
1.2K0
可视化导学-图形基础
WebGL画点程序v2
本文程序实现画一个点的任务,如下图。其中,点的位置坐标由Javascript传到着色器程序中,而不是直接给定(“硬编码”)在顶点着色器中。
步行者08
2018/10/09
7440
WebGL三角形平移变换
本程序实现一个三角形的平移变换任务,最终效果如下图。 整个程序包含两个文件,分别是: 1. TranslatedTriangle.html <!DOCTYPE HTML PUBLIC "-//W3C/
步行者08
2018/10/09
6320
【愚公系列】2023年12月 WEBGL专题-贪吃蛇游戏
贪吃蛇游戏是一种经典的电子游戏,玩家需要控制一条蛇去吃各种食物,使之变得越来越长,并避免撞到自己的身体或墙壁。随着吃到的食物越来越多,蛇的速度也会加快,玩家需要不断调整蛇的方向来避免失败。贪吃蛇游戏可以在电脑、手机、游戏机等不同平台上玩,是一款简单而又有趣的休闲游戏。
愚公搬代码
2025/05/28
430
WebGL学习笔记 | 创建着色器程序
今天本想偷个懒不发文的,在朋友圈看下到下几句话,还是忍不住,看来我得把自己的位定好,坚定不移.
张晓衡
2019/09/11
1K0
WebGL学习笔记 | 创建着色器程序
WebGL画点程序v1
本文程序实现画一个点的任务,如下图。其中,点的位置直接给定(“硬编码”)在顶点着色器中。
步行者08
2018/10/09
5900
WebGL画点程序v3
本文程序实现画一个点的任务,如下图。其中,点的颜色由Javascript传到片元着色器程序中。
步行者08
2018/10/09
7790
WebGL三角形旋转变换
本程序实现一个三角形的旋转变换任务,最终效果如下图。 整个程序包含两个文件,分别是: 1. RotatedTriangle.html <!DOCTYPE HTML PUBLIC "-//W3C//DT
步行者08
2018/10/09
1.2K0
Javascript如何实现GPU加速?
如果只是通用的计算场景呢?比如处理图片中大量像素信息,我们有办法使用GPU资源吗?这正是本文要讲的,GPU通用计算,简称GPGPU。
腾讯Bugly
2018/06/19
2.5K0
快速入门 WebGL
WebGL 是 Web 3D 渲染引擎的基础,它作为非常底层的 API,学习上手难度非常大,这是因为 WebGL 要求的背景知识比较多。而网上的教程一般没有过多介绍直接就介绍 API 开始渲染了,容易让人云里雾里,很容易被劝退,就算学到了 API 使用,也是只懂表面知识,没有了解背后的原理,很容易就忘记了。
羽月
2022/11/11
2.9K0
快速入门 WebGL
Three.js教程(1):初识three.js
今天开始我们进入一个新的世界,那就是3D世界。由于我自己也是刚接触到这块内容,所以如果文章中有问题,请尽快在文章最后的留言板中请指出。本教程有配套代码仓库,请点击https://github.com/KaiOrange/three.js-demo。
kai666666
2020/10/19
23.6K0
Three.js教程(1):初识three.js
几个简单的小例子手把手带你入门webgl
各位同学们大家好,又到了周末写文章的时间,之前群里有粉丝提问, 就是shader不是很理解。然后今天他就来了, 废话不多说,读完今天的这篇文章你可以学到以下几点:
coder_koala
2021/09/18
1.5K0
几个简单的小例子手把手带你入门webgl
【愚公系列】2022年09月 微信小程序-WebGL画渐变色正方形
在现实中webgl的用途很多,比如医院运维网站,地铁运维网站,海绵城市,可以以三维网页形式展示出现实状态。
愚公搬代码
2022/09/30
6050
【愚公系列】2022年09月 微信小程序-WebGL画渐变色正方形
【愚公系列】2022年09月 微信小程序-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网页游戏等等。–百度百科
愚公搬代码
2022/10/05
9330
【愚公系列】2022年09月 微信小程序-WebGL画正方形
相关推荐
WebGL基础 - 笔记
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验