{"id":21529072,"url":"https://github.com/newbeea/gl-widget","last_synced_at":"2026-03-12T15:05:44.440Z","repository":{"id":117987753,"uuid":"211139847","full_name":"newbeea/gl-widget","owner":"newbeea","description":"Webgl framework for UI (banner/image/font/svg), pbr/obj/orbit supported by plugins.","archived":false,"fork":false,"pushed_at":"2022-03-30T12:56:27.000Z","size":5366,"stargazers_count":24,"open_issues_count":0,"forks_count":6,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-08-23T19:30:58.237Z","etag":null,"topics":["banner","canvas","shader","ui","webgl"],"latest_commit_sha":null,"homepage":"https://www.philxu.cn","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/newbeea.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-09-26T16:59:20.000Z","updated_at":"2024-11-07T07:52:12.000Z","dependencies_parsed_at":null,"dependency_job_id":"3ffde790-620d-4db9-9b7e-846b9657e1a0","html_url":"https://github.com/newbeea/gl-widget","commit_stats":null,"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/newbeea/gl-widget","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/newbeea%2Fgl-widget","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/newbeea%2Fgl-widget/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/newbeea%2Fgl-widget/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/newbeea%2Fgl-widget/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/newbeea","download_url":"https://codeload.github.com/newbeea/gl-widget/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/newbeea%2Fgl-widget/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30429384,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-12T14:34:45.044Z","status":"ssl_error","status_checked_at":"2026-03-12T14:09:33.793Z","response_time":114,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["banner","canvas","shader","ui","webgl"],"created_at":"2024-11-24T01:55:44.875Z","updated_at":"2026-03-12T15:05:44.423Z","avatar_url":"https://github.com/newbeea.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# GLWidget  一个面向UI的轻量化、插件化WebGL渲染引擎\n\u003chttps://www.philxu.cn\u003e\n\n![build](https://github.com/newbeea/gl-widget/workflows/build/badge.svg)\n![NPM](https://img.shields.io/npm/l/@gl-widget/gl-widget)\n![npm](https://img.shields.io/npm/dm/@gl-widget/gl-widget)\n![jsDelivr hits (npm)](https://img.shields.io/jsdelivr/npm/hm/@gl-widget/gl-widget)\n\n## GLWidget背景\n一提到WebGL应用，想到的都是展示3D产品，或是3D网页游戏，在普通页面UI上的应用很少，shadertoy上很多酷炫的shader作为UI的一部分应该是很酷的事情，那为什么很少有人尝试呢，除了兼容性的问题，其中很大一部分原因是从零开始搭建WegGL应用过于繁琐，而引用threejs、babylonjs渲染引擎做这样的事情又大材小用。\n\n所以我就想写一款内核极简，又能快速完成搭建shader运行环境的引擎，可以使开发人员专注于shader效果的编写，或是直接移植shadertoy上惊艳的效果。同时，在架构上注重扩展性，通过编写插件，可以扩展成功能更全的引擎。\n\n## 用例\n图片滤镜  [awesome-image filter](https://awesome-image.vercel.app/filter/introduction)\n\n轮播图过渡  [@awesome-image/transition](https://awesome-image.vercel.app/transition/introduction)\n\n## 安装\n### npm\n```bash\nnpm install @gl-widget/gl-widget\n```\n使用\n```js\nimport { GLWidget, RenderableElement, Texture } from '@gl-widget/gl-widget'\nlet glWidget = new GLWidget({\n  element: \"xxx\"\n})\n```\nor\n```js\nimport * as GLWidget from '@gl-widget/gl-widget'\nlet glWidget = new GLWidget.GLWidget({\n  element: \"xxx\"\n})\n```\nor\n```js\nlet GLWidget =  require('@gl-widget/gl-widget')\nlet glWidget = new GLWidget.GLWidget({\n  element: \"xxx\"\n})\n```\n\n### script\n```html\n\u003cscript src=\"http://cdn.jsdelivr.net/npm/@gl-widget/gl-widget/dist/index.umd.js\"\u003e\u003c/script\u003e\n```\n使用\n\n```js\nlet glWidget = new GLWidget.GLWidget({\n  element: \"xxx\"\n})\n```\n### Example\n下面就是简单的shader动画\n```html\n\u003cscript\u003e\n  // 利用 id 或 htmlelement 初始化\n  var glWidget = new GLWidget.GLWidget({\n  element: 'gl-widget'\n  })\n\n\n  let shader = {\n    fragmentShader: `\n      precision mediump float;\n      uniform vec2 resolution; //外部传进来的unifrom变量\n      uniform float     time; //外部传进来的unifrom变量\n      void main () {\n        vec2 uv = gl_FragCoord.xy/resolution.xy;   \n        vec3 col = 0.5 + 0.5*cos(time+uv.xyx+vec3(0,2,4));\n        gl_FragColor = vec4(col,1.0);\n      }\n    `, // 编写fragmentShader，此例用默认vertexShader\n    uniforms: {\n      resolution:{\n        value: glWidget.getSize() // canvas 大小\n      },\n      time: {\n        value: 0\n      }\n    }, // 上面 fragmentShader 中用到的分辨率、时间变量\n  }\n  //每帧动画\n  function animate() {\n    shader.uniforms['time'].value += 0.01 // 设置变量值产生动画效果\n  }\n\n  //开始渲染\n  glWidget.renderBackground(shader, animate)\n\n\u003c/script\u003e\n```\n\n\n## 功能\n### 渲染\n#### 渲染背景\n```js\nglWidget.renderBackground({\n  fragmentShader: '',\n  uniforms: {\n    xxx: {\n      value: xxx\n    }\n  }\n}, animation)\n```\n#### 其他渲染方式\n```js\nlet element = new RenderableElement(shader, geometry) // geometry 参见Geometry 和 BufferGeometry\n// or\n// let element = new Background(shader)\nglWidget.add(element)\nglWidget.render(animation)\n// or\n// glWidget.renderFrame() // 渲染单帧\n```\n#### 可渲染元素\n##### Background\n平铺整个canvas背景，不进行矩阵变换\n##### Skybox\n天空盒\n##### RenderableElement\n前景元素，需搭配Geometry使用\n##### Points\n粒子元素，需搭配Geometry使用，渲染Geometry中点\n\n\n### 相机\n可以在渲染时指定其他相机\n#### 透视相机\n```js\nglWidget.render(animation, new PerspectiveCamera(fov, aspect, near, far))\n```\n#### 正交相机\n```js\nglWidget.render(animation, new OrthographicCamera(left, right, top, bottom, near, far))\n```\n相机的控制可以安装@gl-widget/orbit-controls插件，具体使用参见相关文档\n\n\n### 后期效果\n搭配Pass使用, 参考@gl-widget/pass 插件中RenderPass， SavePass\n```js\n  let renderPass = new RenderPass()\n  glWidget.addPass(renderPass)\n  let savePass = new SavePass()\n  glWidget.addPass(savePass)\n\n  glWidget.renderPass(animate);\n```\n本例展示使用，无添加任何效果\n\n\n### 纹理\n支持普通纹理、cube纹理\n\n\n### 其他\n#### 常用数学库\nMatrix/Quaternion/Vector 等\n#### uniform赋值上传\n直接修改传入的shader.uniforms, 根据类型自动上传数据到webgl\n#### 缓存\n根据需要编译、更新\n\n\n### 插件\n#### @gl-widget/obj-parser\n解析obj生成Geometry\n#### @gl-widget/physical-shader\npbr的光照着色shader\n#### @gl-widget/basic-geometry\n球形等基础几何体\n#### @gl-widget/orbit-controls\n相机控制插件：拖拽旋转、滚轮缩放\n#### @gl-widget/svg-element\n根据svg生成RenderableElement\n#### @gl-widget/font-element\n根据文字生成RenderableElement\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnewbeea%2Fgl-widget","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnewbeea%2Fgl-widget","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnewbeea%2Fgl-widget/lists"}