跟月影学可视化
月影
前奇虎 360 奇舞团团长,可视化 UI 框架 SpriteJS 核心开发者,《JavaScript 王者归来》作者
30206 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 54 讲
跟月影学可视化
15
15
1.0x
00:00/00:00
登录|注册

04 | GPU与渲染管线:如何用WebGL绘制最简单的几何图形?

片元着色器通过设置gl_FragColor的值来定义像素点的颜色
顶点着色器通过gl_Position设置顶点,通过定义varying变量,向片元着色器传递数据
WebGL绘制步骤包括创建WebGL上下文、创建WebGL程序、将数据存入缓冲区、将缓冲区数据读取到GPU、GPU执行WebGL程序,输出结果
GPU是由大量的小型处理单元构成,可以同时处理多个小任务
通用计算机图形系统的绘图过程包括CPU处理数据,GPU生成光栅信息,输出到帧缓存,最后渲染到屏幕上
计算机图形系统主要包括输入设备、中央处理单元、图形处理单元、存储器、帧缓存和输出设备
WebGL相对于其他图形系统来说,是一个更“开放”的系统,需要深入细节
WebGL是最后一个和可视化有关的图形系统,也是最难学的一个
推荐阅读
总结:
主题:WebGL绘制基础
作者:月影
标题:如何用WebGL绘制最简单的几何图形?
参考文章

该思维导图由 AI 生成,仅供参考

你好,我是月影。今天,我们要讲 WebGL。
WebGL 是最后一个和可视化有关的图形系统,也是最难学的一个。为啥说它难学呢?我觉得这主要有两个原因。第一,WebGL 这种技术本身就是用来解决最复杂的视觉呈现的。比如说,大批量绘制复杂图形和 3D 模型,这类比较有难度的问题就适合用 WebGL 来解决。第二,WebGL 相对于其他图形系统来说,是一个更“开放”的系统。
我说的“开放”是针对于底层机制而言的。因为,不管是 HTML/CSS、SVG 还是 Canvas,都主要是使用其 API 来绘制图形的,所以我们不必关心它们具体的底层机制。也就是说,我们只要理解创建 SVG 元素的绘图声明,学会执行 Canvas 对应的绘图指令,能够将图形输出,这就够了。但是,要使用 WebGL 绘图,我们必须要深入细节里。换句话说就是,我们必须要和内存、GPU 打交道,真正控制图形输出的每一个细节。
所以,想要学好 WebGL,我们必须先理解一些基本概念和原理。那今天这一节课,我会从图形系统的绘图原理开始讲起,主要来讲 WebGL 最基础的概念,包括 GPU、渲染管线、着色器。然后,我会带你用 WebGL 绘制一个简单的几何图形。希望通过这个可视化的例子,能够帮助你理解 WebGL 绘制图形的基本原理,打好绘图的基础。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

WebGL技术是一个底层的图形系统,旨在解决复杂的视觉呈现问题。本文深入浅出地介绍了WebGL的基本概念和原理,为读者打下了绘图的基础。文章从图形系统的绘图原理出发,介绍了计算机图形系统的主要组成部分和绘图过程。GPU作为图形处理单元,与CPU一起参与图形计算,通过并行处理大量小任务来处理图像应用。文章详细介绍了如何用WebGL绘制三角形,包括创建WebGL上下文、WebGL程序、存入缓冲区、读取到GPU和执行WebGL程序等步骤。着重介绍了顶点着色器和片元着色器的作用,以及如何创建WebGL程序并将数据存入缓冲区,最终将缓冲区数据读取到GPU。此外,文章还强调了WebGL的并行处理能力,以及顶点着色器和片元着色器在使用上的理解。总之,本文为读者提供了对WebGL技术的深入理解和应用基础,为进一步学习和探索WebGL打下了坚实的基础。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《跟月影学可视化》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(34)

  • 最新
  • 精选
  • 筑梦师刘渊
    作业一 查了下资料,webgl支持的图元类型有七种,分别是 gl.POINTS(点), gl.LINES(线段), gl.LINE_STRIP(线条), gl.LINE_LOOP(回路), gl.TRIANGLES(三角形), gl.TRIANGLE_STRIP(三角带), gl.TRIANGLE_FAN(三角扇)。 要绘制空心三角形,gl.LINE_STRIP(线条)、gl.LINES(线段)、 gl.LINE_LOOP(回路)都可以实现。 但是gl.LINES(线段)需要写入六个顶点([-1, -1, 0, 1, 0, 1, 1, -1, 1, -1,-1, -1]), gl.LINE_STRIP(线条)也需要写入四个顶点([-1, -1, 0, 1, 1, -1,-1, -1]),而gl.LINE_LOOP(回路),只需要是三个顶点([-1, -1, 0, 1, 1, -1]),因此gl.LINE_LOOP(回路)是最佳选择 作业二 a. 先封装一个生成多边形顶点坐标数组的函数 function createCircleVertex(x, y, r, n) { const sin = Math.sin; const cos = Math.cos; const perAngel = (2 * Math.PI) / n; const positionArray = []; for (let i = 0; i < n; i++) { const angel = i * perAngel; const nx = x + r * cos(angel); const ny = y + r * sin(angel); positionArray.push(nx, ny); } return new Float32Array(positionArray); } b. 封装一个生成正多角星顶点的数组函数 function create2CircleVertex(x, y, r, R, n) { const sin = Math.sin; const cos = Math.cos; const perAngel = Math.PI / n; const positionArray = []; for (let i = 0; i < 2 * n; i++) { const angel = i * perAngel; if (i % 2 !== 0) { const Rx = x + R * cos(angel); const Ry = y + R * sin(angel); positionArray.push(Rx, Ry); } else { const rx = x + r * cos(angel); const ry = y + r * sin(angel); positionArray.push(rx, ry); } } return new Float32Array(positionArray); } 1. 正四边形 const points = createCircleVertex(0, 0, 0.5, 4); 2. 正五边形 const points = createCircleVertex(0, 0, 0.5, 5); 3. 正六角星 const points = create2CircleVertex(0, 0, 0.3, 0.6, 6); 以上要绘制空心用gl.LINE_LOOP图元,实心用gl.TRIANGLE_FAN图元 1)空心:gl.drawArrays(gl.LINE_LOOP, 0, points.length / 2); 2)实心:gl.drawArrays(gl.TRIANGLE_FAN, 0, points.length / 2);

    作者回复: 很棒!

    2020-06-30
    2
    50
  • Cailven
    补充:vs不仅仅只有postion值,一般通过attribute 进行属性赋值。在图形学管顶点操作叫做VAO(vertex array object),而vao操作的float数据底层是vbo。不过如果用了threejs后很多图元操作就依赖引擎直接就解决了,但在Threejs中依然可以通过shaderMatiral通过setAttribute给bufferGeometry的顶点赋值。 不过个人在这几年的图形学学习中觉得vs相对还是简单的,fs对于像素的操作很像当年给photoshop写滤镜的过程。不过如果真的是玩片元着色炫技可以看看shadertoy里关于用remaching技术构建距离场用体素算法在片元里构建另一个三维引擎的效果。希望月影大大回头可以针对这方面有所加餐。感谢! 不过这课程来的太晚,如果几年前能早点接触到这门课,估计会在图形学方面少走很多弯路,谢谢月影大大。

    作者回复: VAO是一种组织顶点数据的方式,也是webgl里面常用的方式,它的好处之一是不用每次操作都一一绑定每一组不同的顶点数据。这些属于具体webgl使用上的问题,随着专栏的课程内容深度会有更多介绍。shadertoy很不错的平台,在后面介绍像素处理的课程里会看到一部分shadertoy上比较有趣的例子。

    2020-06-29
    17
  • xiao豪
    老师,将数据存入缓存再拿出来是有什么意义呢?

    作者回复: 因为webgl实际上是JS与GPU进行交互,所以要先将JS的数据存入缓存,在webgl程序运行的时候底层从缓存中读取数据给shader,在shader中完成图形绘制。所以是一读一写的过程

    2020-07-06
    2
    8
  • 宁康
    正n边型,r是外接圆半径 getPolygonPoints( n, r ){ const stepAngle = 2*Math.PI / n let initAngle = 0 const pointArray = [] for(let i = 0; i < n; i++) { // 存储x坐标 pointArray.push(r * Math.cos(initAngle)) // 存储y坐标 pointArray.push(r * Math.sin(initAngle)) initAngle += stepAngle } return pointArray } // 正十边型坐标点 const ponitsArray = getPolygonPoints(10, 1) const ponits = new Float32Array(ponitsArray) gl.drawArrays(gl.TRIANGLE_FAN, 0, ponits.length / 2)

    作者回复: 赞~

    2020-06-29
    5
  • 宁康
    1、gl_Position 设置顶点,这个我查了一下,第四个值设置为2.0也可以实现缩小一倍。 gl_Position = vec4(position, 0.0, 2.0); 2、空心三角形: gl.drawArrays(gl. LINE_LOOP, 0, ponits.length / 2) 3、绘制多边形 a.定义多边形的(x, y)坐标 const ponits = new Float32Array([ -1, -1, 0, -2, 1, -1, 1, 1, -1, 1 ]) b.绘制多边形 gl.drawArrays(gl.TRIANGLE_FAN, 0, ponits.length / 2)

    作者回复: 不错~

    2020-06-29
    3
  • Kevin
    实现了一个正多边形的样例,动态修改边数。 https://codesandbox.io/s/practice-canvas-vme4k?file=/src/pages/RegularPolygonWebGL.vue

    作者回复: 赞

    2020-07-16
    2
  • Kevin
    问题一: 绘制空心三角形使用回路线条:gl.LINE_LOOP gl.drawArrays(gl.LINE_LOOP, 0, points.length / 2); WebGL可绘制的图元有以下7种,来源网络查找:https://www.jianshu.com/p/1e750f20ec23 点 gl.POINTS 线段 gl.LINES 线条 gl.LINE_STRIP 回路线条 gl.LINE_LOOP 三角形 gl.TRIANGLES 三角带 gl.TRIANGLE_STRIP 三角扇 gl.TRIANGLE_FAN

    作者回复: 嗯嗯

    2020-07-15
    2
  • 国旗
    老师问下MDN文档里WebGL常数这儿,表格里十六进制的‘Value’表示的意思是类似于CPU指令寄存器么? Getting GL parameter information这节BLEND_EQUATION,BLEND_EQUATION_RGB的value都是0x8009,也有点不理解 https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/Constants

    作者回复: 就是一个代表状态常量的数值,设计的时候定下来的。

    2020-09-23
    1
  • 不见飞刀
    "图形中有多少个像素点,着色器程序在 GPU 中就会被同时执行多少次。" 顶点着色器是否一样还是有几个顶点就执行多少次呢? 传给片元的varying变量会线性差值,那么插值这一步发生在哪呢?

    作者回复: 是的,顶点着色器执行次数和顶点数量有关。插值发生在光栅化的时候。

    2020-08-29
    3
    1
  • 莫轩竹
    请问编写glsl有什么智能提示插吗,我用的vscode?

    作者回复: vscode有插件,商店里搜一下就有

    2020-08-01
    1
收起评论
显示
设置
留言
34
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部