打造原生 WebGL 2D 引擎:一场创意与技术的融合

1.引言

在当今数字化时代,网页的功能越来越丰富,已经远远超越了传统的文本和图片呈现。我们生活在一个充满交互性和视觉魅力的网络世界。每天都会遇到许多令人惊叹的网页效果和动画。作为一个Web3D图形的开发,希望可以通过网页来实现更多强大的功能,以及炫酷的效果。

在设计方面:

要实现真正令人叹为观止的网页效果,并不是一件容易的事情。传统的网页设计和CSS动画有着一定的限制。

在功能方面:

受制于浏览器的性能。无法在浏览器端开发很多很强大的工具。

正当我苦苦寻求突破时,WebGL技术闪现在我的视野中。作为一种强大的Web图形库,它能够在浏览器中实现硬件加速的图形渲染,为我提供了无限的创意空间。我决定用自己的双手打造一个基于原生 WebGL 的2D引擎,旨在让我能够轻松处理图像和创作出令人眼前一亮的网页效果。

或许有人问,我是一个web3D开发,为啥要开发一个2D的工具:

首先:web端3D已经有很强大成熟的库了,比如Three.js,Babylon.js,PlayCanvas等,当然优秀的2D库也很多比如:PixiJS等,但是相对于很多3D开发者来讲,大部分人学的还是threejs居多,如果在学习2D库无非会增加很多的学习成本,这里我开发的2D渲染引擎,参照了threejs ShaderMaterial的用法,精简了很多的功能,基于原生webGL,降低了一些开发的学习成本,提升了做2D Web处理的速度。

2.WebGL简介

参照初识web3D--webGL/webGPU

3.设计和架构

  1. 模块化设计

    在开发我的基于原生 WebGL 的2D引擎时,我注重了整体的模块化设计。通过将引擎功能拆分为各个独立的模块,我使得每个模块都可以单独处理特定任务,而不会对其他部分产生影响。这种设计使得我的引擎更易于扩展和维护。

  2. 基于 ShaderMaterial 的使用

    在设计引擎的渲染部分时,我参考了Three.js中ShaderMaterial的用法。ShaderMaterial允许开发者通过GLSL着色器语言自定义材质的渲染效果,为图形和动画带来更多的创意和自由度。通过借鉴这一思想,我为我的引擎提供了类似的ShaderMaterial接口,使得用户可以轻松地自定义渲染效果,而无需深入了解底层WebGL的复杂细节。这样做的优点在于可以降低用户使用引擎的学习成本,同时又不牺牲灵活性和性能。

  3. 渲染管线优化

    在引擎的设计过程中,我重点优化了渲染管线。通过合并和批量处理渲染调用,减少了WebGL上下文切换和资源上传的次数,从而提高了渲染性能。同时,我还实现了简单的渲染批处理机制,以降低绘制调用的开销。这些优化措施让我的引擎在处理大量2D图形时依然保持流畅。

  4. 跨浏览器支持

    我在引擎的设计中注重了跨浏览器支持。尽管WebGL技术在现代浏览器中得到广泛支持,但不同浏览器对WebGL的实现仍然存在一些差异。为了确保引擎的兼容性,我进行了充分的测试,并针对不同浏览器做了必要的适配。

  5. API简洁易用

    在设计引擎的API时,我力求简洁易用。我为引擎的核心功能提供了直观的接口,使得用户可以迅速上手并快速实现自己的创意。同时,我也提供了详细的文档和示例代码,帮助用户更好地了解和使用引擎。

  6. 扩展性与灵活性

    在整体设计中,我注重了引擎的扩展性与灵活性。通过良好的模块化设计,用户可以自定义和添加新的功能模块,满足不同项目的需求。同时,用户还可以根据自己的喜好和风格定制引擎的外观和交互效果。

通过以上的设计和架构,我的基于原生 WebGL 的2D引擎成为了一个功能强大、易于上手的工具,为用户提供了创作炫酷网页效果和处理图像的绝佳体验。

4.关于我的WebGL2D引擎

名称:TwinSpace2D

使用方法:

npm i twinspace2d

通过npm直接引入到web项目中

相关代码展示

const geometry = new Geometry();

const width = 2048;
const height = 1024; geometry.setAttribute(
"position",
new Float32Array([0,0,width,0,width,height,width,height,0,height,0,0]),
2
);
const material = new ShaderMaterial({
uniforms: {
u_resolution: {
value: new TSVector2(T2D.canvas.clientWidth, T2D.canvas.clientHeight),
},
map: {
value: null,
},
mouseMove: {
value: new TSVector2(0, 0),
},
},
fragmentShader: movePointerFrag,
vertexShader: movePointerVert,
});
new TextureLoader().load("/public/demo1.png", (texture) => {
material.uniforms.map.value = texture;
});
const mesh = new Mesh(geometry, material);

有没有看着觉得很耳熟。没错,为了方便开发,我把写法改成了threejs的写法,但是没有用three的代码,基于原生webgl自己独立封装;

为什么没做三维,三维要写很多矩阵变换啥的,说实话,本人比较懒,这种事,就交给大佬们吧。

5.案例展示

目前就简单展示一个,后续会出更多相关案例

这是一个用TwinSpace2D传入了一张图,然后传入了鼠标的坐标,然后实现的一个简单的效果。

后续会推出更多相关案例和demo。敬请期待

6.未来展望

当初写这个2D引擎的目的是想用threejs实现2D的效果,然后发现会有很多无用的占用,需要写一堆东西,感觉每次这么处理会比较麻烦,学习新的webgl2D库,学习成本太高,于是打算自己基于webgl写一个简单的纯粹的2D处理工具库。

希望未来有更多的人,可以通过这个工具库让网页的效果内容更加丰富,效果更加酷炫,能真正意义上帮助各位开发提升开发效率,实现更加炫酷强大的功能。

后续会出一些图片处理的demo以及一些炫酷的网页效果。完善2D工具库的功能。等功能稍微完善了,就正式开源。希望能帮助到各位学习web图形技术。

7.为什么不直接上WebGPU

虽然谷歌已经在Chrome113后续的版本都支持了WebGPU,标准也定下来了,但是目前移动端还没完全适配,以及一些老用户的PC也没有更新升级,等后续相关设备都支持了,就考虑出一个WebGPU版本的。

打造原生 WebGL 2D 引擎:一场创意与技术的融合的更多相关文章

  1. WEBGL 2D游戏引擎研发系列 第一章 <新的开始>

    WEBGL 2D游戏引擎研发系列 第一章 <新的开始> ~\(≥▽≤)/~HTML5游戏开发者社区(群号:326492427) 转载请注明出处:http://html5gamedev.or ...

  2. 3D游戏编程大师技巧──2D引擎的编译问题

    接上一篇文章,这里将介绍2D引擎的编译,从现在开始才真正进入<3D游戏编程大师技巧>的学习.本书的第一.二章只是简介了游戏编程和windows编程,从第三章开始才是介绍<window ...

  3. 玩玩小程序:使用 WebApi 交互打造原生的微信小程序 - 图灵小书架

    使用 WebApi 交互打造原生的微信小程序 - 图灵小书架 目录 介绍 源码地址 扫一扫体验 代码分析 其它相关信息(互联网搜集) 介绍 定时抓取图灵社区官网的首页.最热.推荐和最新等栏目的相关图书 ...

  4. 前后端数据交互处理基于原生JS模板引擎开发

    json数据错误处理,把json文件数据复制到----> https://www.bejson.com/ 在线解析json 这样能直观的了解到是否是json数据写错,在控制台打断点,那里错误打那 ...

  5. 原生WebGL场景中绘制多个圆锥圆柱

    前几天解决了原生WebGL开发中的一个问题,就是在一个场景中绘制多个几何网格特征不同的模型,比如本文所做的绘制多个圆锥和圆柱在同一个场景中,今天抽空把解决的办法记录下来,同时也附上代码.首先声明,圆柱 ...

  6. OpenKruise - 云原生应用自动化引擎正式开源

    2019 年 6 月 24 日至 26 日, 由 Cloud Native Computing Foundation (CNCF) 主办的云原生技术大会 KubeCon + CloudNativeCo ...

  7. 公有云上构建云原生 AI 平台的探索与实践 - GOTC 技术论坛分享回顾

    7 月 9 日,GOTC 2021 全球开源技术峰会上海站与 WAIC 世界人工智能大会共同举办,峰会聚焦 AI 与云原生两大以开源驱动的前沿技术领域,邀请国家级研究机构与顶级互联网公司的一线技术专家 ...

  8. Phaser开源2d引擎 javascript/html5游戏框架

    功能特点(Features) 易维护代码(Easy Asset Loading) Phaser可以加载图片,音频文件,数据文件,文本文件和自动解析精灵图和纹理地图集数据(出口纹理封隔器或Flash C ...

  9. Wonder 1.0正式版发布-----WebGL 3D引擎和编辑器

    介绍 我们很荣幸地向大家发布Wonder 1.0正式版!免费.开源,不用注册,直接打开在线编辑器即可使用! Wonder是web端3D开发的解决方案,包括引擎.编辑器,致力于打造开放.分享.互助的生态 ...

  10. 从零打造一个Web地图引擎

    说到地图,大家一定很熟悉,平时应该都使用过百度地图.高德地图.腾讯地图等,如果涉及到地图相关的开发需求,也有很多选择,比如前面的几个地图都会提供一套js API,此外也有一些开源地图框架可以使用,比如 ...

随机推荐

  1. 如何获取苹果设备的UDID(iPhone/iPad UDID查询方法)

      方法一.通过电脑连接苹果手机后查询 1.在电脑上下载并安装爱思助手,安装完成后将电脑和苹果手机使用苹果数据线连接起来: ​ 编辑切换为居中 添加图片注释,不超过 140 字(可选) 然后启动爱思助 ...

  2. Kubesphere中DevOps流水线无法部署/部署失败

    摘要 总算能让devops运行以后,流水线却卡在了deploy这一步.碰到了两个比较大的问题,一个是无法使用k8sp自带的kubeconfig认证去部署:一个是部署好了以后但是没有办法解析镜像名. 版 ...

  3. [Pytorch框架]3.2 MNIST数据集手写数字识别

    文章目录 3.2 MNIST数据集手写数字识别 3.2.1 数据集介绍 3.2.2 手写数字识别 3.2 MNIST数据集手写数字识别 import torch import torch.nn as ...

  4. 音视频八股文(10)-- mp4结构

    介绍 mp4⽂件格式⼜被称为MPEG-4 Part 14,出⾃MPEG-4标准第14部分 .它是⼀种多媒体格式容器,⼴泛⽤于包装视频和⾳频数据流.海报.字幕和元数据等.(顺便⼀提,⽬前流⾏的视频编码格 ...

  5. 2022-10-05:在一个 n x n 的整数矩阵 grid 中, 每一个方格的值 grid[i][j] 表示位置 (i, j) 的平台高度。 当开始下雨时,在时间为 t 时,水池中的水位为 t 。

    2022-10-05:在一个 n x n 的整数矩阵 grid 中, 每一个方格的值 grid[i][j] 表示位置 (i, j) 的平台高度. 当开始下雨时,在时间为 t 时,水池中的水位为 t . ...

  6. 2020-12-25:MQ中,如何保证消息的顺序性?

    福哥答案2020-12-25:[稍微详细的答案:](http://bbs.xiangxueketang.cn/question/875)生产者保证消息入队的顺序.MQ 本身是一种先进先出的数据接口,将 ...

  7. vue全家桶进阶之路6:Vue的安装以及js引入

    1.安装 注意:Vue 不支持 IE8 及以下版本 创建一个文件夹用于下载引入Vue D:\BaiduSyncdisk\vue2 按照最新版本的Vue npm install vue 创建完成后便可以 ...

  8. uni-app 打包发行

    1.云端 发行-原生App-云打包 2.离线 运行-原生App本地打包-生成本地打包资源,如果提示安装依赖包,安装即可 注意:项目的AppID不能为空,请在该项目下的manifest.json中重新获 ...

  9. ComboBox1 绑定手动创建的DataTable

    '************************************************** '*过程名称:DT_PAFORMAL '*功能说明:员工类别 '**************** ...

  10. 数据挖掘实践(金融风控):金融风控之贷款违约预测挑战赛(上篇)[xgboots/lightgbm/Catboost等模型]--模型融合:stacking、blending

    数据挖掘实践(金融风控):金融风控之贷款违约预测挑战赛(上篇)[xgboots/lightgbm/Catboost等模型]--模型融合:stacking.blending 1.赛题简介 赛题以金融风控 ...