HyperFrames HTML-in-Canvas 实战:把任意 HTML/CSS 变成 GPU 纹理并驱动 60fps 影视级画面
HyperFrames HTML-in-Canvas 实战把任意 HTML/CSS 变成 GPU 纹理并驱动 60fps 影视级画面【免费下载链接】hyperframesWrite HTML. Render video. Built for agents.项目地址: https://gitcode.com/GitHub_Trending/hy/hyperframesHTML-in-Canvas 是 HyperFrames 最具表现力的视觉能力通过浏览器原生的drawElementImageAPI把任意实时 HTML/CSS 内容文字、图片、卡片、仪表盘等直接捕获为 GPU 纹理再交给 WebGL 着色器、Three.js 3D 场景或后期处理效果逐帧渲染——支持全部 CSS 特性、像素级保真并可在最终视频中以 60fps 输出。读完本文你将掌握HTML-in-Canvas 的统一样板代码、5 类官方 VFX 效果的完整实现思路、6 类自定义 GLSL 效果模板以及哪些场景该用 HTML-in-Canvas、哪些该用普通 GSAP的取舍原则从而为 13 个关键英雄节拍注入电影级视觉。适用场景定位当某个节拍值得超出平面 GSAP 动画的影视级处理时使用建议每个视频只用于 13 个 hero beat其余节拍继续使用标准 GSAP——平面节拍与 HTML-in-Canvas 节拍的对比本身就是视觉叙事的一部分。核心样板所有 HTML-in-Canvas 合成共用的统一结构每个 HTML-in-Canvas 效果都共享同一套结构学一次即可适配任意效果。它由两个画布和一段驱动逻辑组成HTML 部分——源画布隐藏与输出画布可见!-- 1. Source HTML — your content goes inside a layoutsubtree canvas -- canvas idhic-source layoutsubtree width1920 height1080 styleposition:absolute;inset:0;opacity:0; div idhic-content stylewidth:1920px;height:1080px; !-- YOUR HTML CONTENT HERE — text, images, cards, dashboards, anything -- /div /canvas !-- 2. Render target — the visible canvas that shows the effect -- canvas idhic-output width1920 height1080 styleposition:absolute;inset:0;/canvasJS 部分——能力检测、逐帧捕获、GSAP 驱动// 3. Feature detection — always check, always provide fallback function isHiCSupported() { var tc document.createElement(canvas); if (!(layoutSubtree in tc)) return false; tc.setAttribute(layoutsubtree, ); var ctx tc.getContext(2d); return ctx typeof ctx.drawElementImage function; } var apiOk isHiCSupported(); // 4. Capture function — call this every frame in onUpdate var capCanvas document.getElementById(hic-source); var capCtx capCanvas.getContext(2d); function captureContent() { if (apiOk) { capCtx.drawElementImage(document.getElementById(hic-content), 0, 0, 1920, 1080); } } // 5. Drive from GSAP timeline — capture render every frame tl.to( proxy, { /* your animation properties */ duration: BEAT_DURATION, ease: sine.inOut, onUpdate: function () { captureContent(); // render your effect here (Three.js or WebGL2) }, }, 0, );五个组成部分逐一拆解源画布layoutsubtreecanvaslayoutsubtree属性是关键——它让浏览器把画布内子元素作为独立子树参与布局与绘制是drawElementImage能读到其绘制记录paint records的前提。画布置于opacity:0且绝对定位铺满画幅不参与可见渲染。输出画布承载 WebGL/Three.js 渲染结果是观众真正看到的画面。能力检测isHiCSupported()依次检查layoutSubtree属性、设置属性后的 2D 上下文以及drawElementImage方法是否存在。这一检测与 packages/shader-transitions/src/capture.ts 中isHtmlInCanvasCaptureSupported()的实现完全一致——该函数被用于过渡效果库判断是否启用原生 HTML-in-Canvas 捕获路径。逐帧捕获每次onUpdate调用drawElementImage(content, 0, 0, 1920, 1080)把当前 HTML 状态实时绘制到源画布之后该画布即作为 WebGL 纹理上传。GSAP 驱动渲染器从不播放动画而是逐帧 seek——请求一帧、等待、捕获、再请求下一帧见 docs/concepts/frame-adapters.mdx 中的帧适配器协议。因此所有动画属性都应通过 GSAP timeline 驱动保证确定性输出。回退策略无 API 时的占位方案当drawElementImage不可用例如未开启 Chrome 实验 flag 的预览环境应绘制纯色占位或使用 Canvas 2D 文本。HyperFrames 渲染器会自动开启该 flag——最终成片必然生效。完整回退示例可参考ios26-liquid-glassblockregistry/blocks/ios26-liquid-glass。源码级佐证layoutsubtree特性依赖 Chrome 的CanvasDrawElement实验特性。在 packages/engine/src/services/drawElementService.ts 中明确说明canvas.drawElementImage(element, x, y)直接把 DOM 绘制记录读入画布绕过完整合成器管线需要 Chrome flag--enable-featuresCanvasDrawElement引擎已全局添加。同一文件还给出了性能事实在本地 GPU 上比Page.captureScreenshot快约 46%Alpha 通道像素级完美PSNR∞而 Docker/SwiftShader 软渲染环境下会自动回退到截图路径。这就是预览时可回退、成片必然生效的底层原因。效果目录官方 VFX 五连击1. 3D 旋转 Bloom 辉光Three.js视觉效果内容悬浮在 3D 空间中缓慢旋转亮部边缘带电影感辉光——如同黑暗影院中展示的产品截图。适用场景主角产品展示、功能揭晓、带高级感的 CTA。核心组件PlaneGeometryCanvasTextureEffectComposerUnrealBloomPass// After the boilerplate above, add: var scene3d new THREE.Scene(); var camera new THREE.PerspectiveCamera(45, 1920 / 1080, 0.1, 100); camera.position.set(0, 0, 4); var renderer new THREE.WebGLRenderer({ canvas: document.getElementById(hic-output), antialias: true, alpha: true, }); renderer.setSize(1920, 1080); var texture new THREE.CanvasTexture(capCanvas); var mesh new THREE.Mesh( new THREE.PlaneGeometry(3.6, 2.2), new THREE.MeshBasicMaterial({ map: texture }), ); scene3d.add(mesh); // Post-processing: bloom for cinematic glow. // EffectComposer / RenderPass / UnrealBloomPass are ES-module named imports // (see the import block below) — theyre NOT properties of THREE in modern // versions. Three.js r150 removed the UMD examples/js/ globals. var composer new EffectComposer(renderer); composer.addPass(new RenderPass(scene3d, camera)); composer.addPass(new UnrealBloomPass(new THREE.Vector2(1920, 1080), 0.3, 0.4, 0.85)); var proxy { rotY: -0.12, zoom: 4.2 }; tl.to( proxy, { rotY: 0.12, zoom: 3.6, duration: BEAT_DURATION, ease: sine.inOut, onUpdate: function () { captureContent(); texture.needsUpdate true; mesh.rotation.y proxy.rotY; camera.position.z proxy.zoom; composer.render(); }, }, 0, );模块化加载 Three.js 与后期处理注意typemodulescript typemodule import * as THREE from https://cdn.jsdelivr.net/npm/three0.181.2/esm; import { EffectComposer } from https://cdn.jsdelivr.net/npm/three0.181.2/examples/jsm/postprocessing/EffectComposer.js; import { RenderPass } from https://cdn.jsdelivr.net/npm/three0.181.2/examples/jsm/postprocessing/RenderPass.js; import { ShaderPass } from https://cdn.jsdelivr.net/npm/three0.181.2/examples/jsm/postprocessing/ShaderPass.js; import { UnrealBloomPass } from https://cdn.jsdelivr.net/npm/three0.181.2/examples/jsm/postprocessing/UnrealBloomPass.js; // ... rest of composition code using these imports /script版本注意事项examples/js/路径在 Three.js r152 被移除必须使用examples/jsm/ES 模块。上文使用three0.181.2——即 HyperFrames Three.js 适配器所用的版本。UnrealBloomPass的三个参数依次为分辨率、强度0.3、半径0.4、阈值0.85调大强度与半径可获得更夸张的发光效果。源码佐证Three.js 的CanvasTexture正是以源画布为纹理来源——捕获画布capCanvas每帧被drawElementImage刷新后只需设置texture.needsUpdate true即可让 GPU 端纹理同步最新 DOM 状态。这与 packages/engine/src/services/threeDProjection.ts 中纹理每帧重投影的处理思路同源该模块负责把 CSS 3D 渲染上下文perspective/preserve-3d在捕获前重写为 WebGL 投影画布解决drawElementImage无法绘制 CSS 3D 上下文背面可见性被忽略、同级元素丢失、背景丢失的已知缺陷。2. 磁吸光标扭曲原生 WebGL2视觉效果内容朝移动点弯曲变形像磁铁吸附像素变形处伴随 RGB 通道色散chromatic aberration。适用场景互动感演示、带光标的产【免费下载链接】hyperframesWrite HTML. Render video. Built for agents.项目地址: https://gitcode.com/GitHub_Trending/hy/hyperframes创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考