1 概述

笔者在几年前写过一系列关于WebGL的文章《WebGL简易教程——目录》,前端时间将其整理了一下,增加了一个在线案例的站点以便于学习查看。这里就顺便写一段结语吧。

2 观点

2.1 建议

这个系列文章写了十五篇,之所以不继续写了是因为写到后面代码越来越膨胀(比如《WebGL简易教程(十四):阴影》中的实现写了700行代码),一些高级的图形技术要通过WebGL这样底层的API来实现就不是一件很容易的事情。一般来说,要较好的实现比较高级的图形技术,最好需要经过一定的封装(可以参考一些图形引擎),否则代码复杂度会非常高。

因此,如果读者已经完成了这十五篇教程的学习,那么接下来就建议读者可以选一门图形引擎来学习,研究一下比较高级的图形技术的实现。其实如果学习时间很紧张,并且接受程度比较高,直接选择一门图形引擎学习也可以。当然WebGL这样底层的接口还是值得学习的,不过就类似于基本功,会对日后的工作产生直接或间接的助力。

另外,虽然已经有了Vulkan、WebGPU以及DX12这样的现代图形api,但是我不觉得初学者能直接入门这些更加底层的图像API。图形技术的发展与软件编程技术相反,不是越来越高级,反而越来越低级,倾向于更好地挖掘硬件的性能。没办法,目前硬件的发展就是跟不上图形技术的需求,性能总是绝对的刚需。你当然可以使用更加高级的图形引擎API,但是凡封装必有代价,你总有遇到需要使用底层API的时候。

2.2 趋势

笔者还记得当年学习WebGL的时候,主流浏览器还只支持WebGL 1.0,但是现在主流浏览器几乎都已经支持WebGL 2.0,甚至包括以封闭保守著称的Safari。也就是说,即使是Web端图形技术的趋势是WebGPU,但是WebGL自身也还是不断演进中。不要觉得支持WebGL 2.0没什么意义,要知道WebGL 2.0对应于嵌入式端的OpenGL ES3.0,以及桌面端的OpenGL 3.3,这使得我们增加了相当多的图形技术可以使用,比如实例化渲染、多目标渲染等等。更重要的意义是,WebGL已经是最轻量的图形技术API了,如果浏览器端都不支持的设备,你就可以光明正大地跟业主说需要设备升级了。其实在信创、嵌入式等项目中,因为一些兼容性问题,还是不得不上OpenGL这样的老家伙;你说WebGL要被WebGPU淘汰,那估计还得等很长一段时间。

还有一个很有意思的地方,前面我说苹果系的技术体系是很封闭保守的,在自家的设备上甚至不愿意支持OpenGL;但是在Safari上却乐于推进WebGL和WebGPU。其实原因很简单,我们所用的WebGL API其实并不是像我们设想的那样是直接使用显卡驱动里面OpenGL API,还是根据不同的平台使用这些平台上首选图像API接口。比如在Windows操作系统Chrome浏览器的WebGL,后台使用的其实是DX12;而苹果系统Safari浏览器的WebGL,后台使用的却是Metal。如果你进一步深入图形技术行业,你就知道这种图形API相互转义非常常见,这其实告诉我们一个道理:不同的图形API其实是大同小异的,关键是要掌握图形技术的思想。

3 教程

记得前些年WebGL最火爆的时候,很多HR会在前端行业招会WebGL的,也有很多前端程序员在询问是不是应该要接手WebGL的工作。其实传统意义上的前端和WebGL除了都使用JavaScript外,两者没有任何共同点。传统意义上的前端解决的是事务型的,约定俗成的界面交互性问题;WebGL则关注的是如何可视化能被人眼识别接受的不同行业的场景。WebGL其实属于图形领域,俗称就是“搞三维的”。让前端从业人员去做WebGL,无异于是让这个人换行业了,而且是换到了一个相对更加艰深的行业,多半是很难搞定的。

但是调换一下,如果一个图形从业者来搞WebGL,多半也是会对目前的前端技术感到眼花缭乱。说真的,现在的前端还能说上手很简单:我写一个html+js,丢到浏览器里面就能运行吗?说实话,应该不完全行了吧?至少我想要规范的ES6模块是不行的,至少我需要开一个HTTP服务器,将代码放到Web域内才行;更不谈后面使用构建工具,安装依赖库等等,这些都是隐形的入门成本。

笔者在整理以前写的WebGL教程的时候,本来也是想将代码修改的更加规范,符合目前的前端主流开发范式一点。但是改起来的时候就觉得,学习WebGL的重点应该是了解其中的图形技术,前端技术其实不是重点,更何况来看WebGL教程的可能并不太会前端。所以笔者还是保留了之前WebGL教程的代码:WebGLTutorial 。另外,笔者增加了一个在线案例的站点以便于学习查看,并且在线案例的项目也在Git上开源了:webgl-tutorial-online

具体来说,两者有什么区别呢?WebGLTutorial会更加原生一点,不用开启Web服务器,直接通过浏览器就可以运行。主要是用到一些文件资源,会引起跨域问题;但是原生的JS其实是由文件资源操作的,通过打开指定的文件就可以避开安全策略,可以不依赖Web服务器域内访问。笔者也是推荐使用这个代码进行学习,毕竟学习WebGL,JS不是关键,关键是学习其中的图形技术。当然你有前端基础,看看webgl-tutorial-online也行,其中的代码可能更规范一点,功能更多,所以学习成本也会高一点。

4 资源

在文章最后就列出本教程的相关资源:

  1. WebGL简易教程——目录
  2. WebGL简易教程在线案例
  3. 代码和数据地址:WebGLTutorial
  4. WebGL简易教程在线案例项目源码

WebGL简易教程——结语的更多相关文章

  1. WebGL简易教程(二):向着色器传输数据

    目录 1. 概述 2. 示例:绘制一个点(改进版) 1) attribute变量 2) uniform变量 3) varying变量 3. 结果 4. 参考 1. 概述 在上一篇教程<WebGL ...

  2. WebGL简易教程(三):绘制一个三角形(缓冲区对象)

    目录 1. 概述 2. 示例:绘制三角形 1) HelloTriangle.html 2) HelloTriangle.js 3) 缓冲区对象 (1) 创建缓冲区对象(gl.createBuffer( ...

  3. WebGL简易教程(四):颜色

    目录 1. 概述 2. 示例:绘制三角形 1) 数据的组织 2) varying变量 3. 结果 4. 理解 1) 图形装配和光栅化 2) 内插过程 5. 参考 1. 概述 在上一篇教程<Web ...

  4. WebGL简易教程(六):第一个三维示例(使用模型视图投影变换)

    目录 1. 概述 2. 示例:绘制多个三角形 2.1. Triangle_MVPMatrix.html 2.2. Triangle_MVPMatrix.js 2.2.1. 数据加入Z值 2.2.2. ...

  5. WebGL简易教程(七):绘制一个矩形体

    目录 1. 概述 2. 示例 2.1. 顶点索引绘制 2.2. MVP矩阵设置 2.2.1. 模型矩阵 2.2.2. 投影矩阵 2.2.3. 视图矩阵 2.2.4. MVP矩阵 3. 结果 4. 参考 ...

  6. WebGL简易教程(九):综合实例:地形的绘制

    目录 1. 概述 2. 实例 2.1. TerrainViewer.html 2.2. TerrainViewer.js 3. 结果 4. 参考 1. 概述 在上一篇教程<WebGL简易教程(八 ...

  7. WebGL简易教程(八):三维场景交互

    目录 1. 概述 2. 实例 2.1. 重绘刷新 2.2. 鼠标事件调整参数 3. 结果 4. 参考 1. 概述 在上一篇教程<WebGL简易教程(七):绘制一个矩形体>中,通过一个绘制矩 ...

  8. WebGL简易教程(十):光照

    目录 1. 概述 2. 原理 2.1. 光源类型 2.2. 反射类型 2.2.1. 环境反射(enviroment/ambient reflection) 2.2.2. 漫反射(diffuse ref ...

  9. WebGL简易教程(十一):纹理

    目录 1. 概述 2. 实例 2.1. 准备纹理 2.2. 配置纹理 2.3. 使用纹理 3. 结果 4. 参考 1. 概述 在之前的之前的教程<WebGL简易教程(九):综合实例:地形的绘制& ...

  10. WebGL简易教程(十二):包围球与投影

    目录 1. 概述 2. 实现详解 3. 具体代码 4. 参考 1. 概述 在之前的教程中,都是通过物体的包围盒来设置模型视图投影矩阵(MVP矩阵),来确定物体合适的位置的.但是在很多情况下,使用包围盒 ...

随机推荐

  1. Jenkins持续集成 docker、gitlab、sonar

    Jenkins是一个功能强大的应用程序,允许持续集成和持续交付项目,无论用的是什么平台.这是一个免费的源代码,可以处理任何类型的构建或持续集成.集成Jenkins可以用于一些测试和部署技术.Jenki ...

  2. K8s新手系列之资源清单(Manifests)

    Manifests的基本概念 在 Kubernetes 中,Manifests(清单)是用于定义集群中资源对象的声明式配置文件(通常以 YAML 或 JSON 格式编写,生产环境中通常以YAML编写) ...

  3. 代码随想录第十一天 | Leecode 150. 逆波兰表达式求值、239. 滑动窗口最大值、347. 前k个高频词

    Leecode 150. 逆波兰表达式求值 题目链接:https://leetcode.cn/problems/evaluate-reverse-polish-notation/description ...

  4. 【MOOC】JS脚本|便于复制粘贴中国大学MOOC网站的测试题和选项

    文章目录 运行结果 完整代码 可复用的部分 1. 删除指定Class或Id的DOM元素 2. 在页面上添加按钮并绑定事件.添加css.class 3. 等待页面加载完成,运行异步函数 4. 选中某个D ...

  5. 数据库问题之“字符编码问题 Cause: java.sql.SQLException: Incorrect string value: '\xF0\x9F\x8E\x81\xE7\x88...' for column 'product_name' at row 41”

    1)表1和表2的产品名称[数据库字段]字符编译方式不一致 ①问题 org.springframework.jdbc.UncategorizedSQLException: Error updating ...

  6. Django内置filter总结

    内置过滤器 目的是对绝大多数的内置过滤器进行测试总结学习,现设置如下: urls.py中设置: urlpatterns=[ url(r'^method',views.method,name='meth ...

  7. 用鼠标画圆点(java GUI)

    话不多说,先看效果 当然你也可以发挥脑洞绘制更更棒的 源码如下: package javaBasic; import java.awt.*; import java.awt.event.*; impo ...

  8. 基于Scikit-learn与Flask的医疗AI糖尿病预测系统开发实战

    引言 在精准医疗时代,人工智能技术正在重塑临床决策流程.本文将深入解析如何基于MIMIC-III医疗大数据集,使用Python生态构建符合医疗AI开发规范的糖尿病预测系统.项目涵盖从数据治理到模型部署 ...

  9. [Redis] Redis (7) 连接与会话管理

    序:文由 因今日排查问题,发现微服务因 ERR max number of clients reached (已达到客户端的最大数量) redis异常,而导致服务在健康检测时未通过,进而导致高频宕机. ...

  10. 面试题:String,StringBuilder,StringBuffer三者的区别

    摘要:总结Java中的String,StringBuilder,StringBuffer三者的区别和联系,介绍后两者的扩容机制.   Java中的String,StringBuilder,String ...