打造原生 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. DevOps、SRE、平台工程的区别

    DevOps.SRE和平台工程的概念在不同时期出现,并由不同的个人和组织开发. DevOps作为一个概念是由Patrick Debois和Andrew Shafer在2009年的敏捷会议上提出的.他们 ...

  2. 深度学习--魔法类nn.Module

    深度学习--魔法类nn.Module 作用 pytorch 封装了一些基本的网络类,可以直接调用 好处: 可以直接调用现有的类 容器机制:self.net = nn.Sequential() 参数返回 ...

  3. js中宏任务和微任务

    宏任务包括:<script>整体代码.setTimeout.setInterval.setImmediate.Ajax.DOM事件微任务:process.nextTick.Mutation ...

  4. 推荐一个基于.Net Framework开发的Windows右键菜单管理工具

    平常在我们电脑,我们都会安装非常多的软件,很多软件默认都会向系统注册右键菜单功能,这样方便我们快捷打开.比如图片文件,通过右键的方式,快捷选择PS软件打开. 如果我们电脑安装非常多的软件,就会导致我们 ...

  5. Python数据分析中 melt()函数的一些用法

    melt()函数是一个数据重塑工具,用于将宽格式数据转换为长格式数据(Unpivot a DataFrame from wide to long format, optionally leaving ...

  6. go for range的坑

    package main import "fmt" func main() { ParseStudent() } type student struct { Name string ...

  7. 生信入门必须掌握的 30 个 Linux 命令

    学习生物信息,Linux 是必须掌握的内容,其实常用的 Linux 命令也就 30 个左右,而且这些命令都是单词的简写,记忆起来并不困难.这里列出了常用的 30 个命令. 1. cd Change d ...

  8. 大型 3D 互动开发和优化实践

    开发背景 得益于"元宇宙"概念在前段时间的爆火,各家公司都推出了使用 3D 场景的活动或频道. 3D 场景相比传统的 2D 页面优点是多一个维度,同屏展示的内容可以更多,能完整的展 ...

  9. 手记系列之五 ----- SQL使用经验分享

    前言 本篇文章主要介绍的关于本人从刚工作到现在使用Sql一些使用方法和经验,从最基本的SQL函数使用,到一些场景的业务场景SQL编写. SQL基础函数使用 1.字段转换 CASE WHEN  意义: ...

  10. 软件测试从小白进阶高手-Python自动化+Jmeter性能+App项目+接口测试

    软件测试从小白进阶高手-Python自动化+Jmeter性能+App项目+接口测试 软件测试技能,包括Python自动化.Jmeter性能测试.App项目测试.接口测试.接下来,我将从每个技能点给出一 ...