Steam 工坊 40 万张 Wallpaper Engine 场景壁纸的浏览器原生渲染引擎 + HLSL→GLSL 实时转译器。
Wallpaper Engine 的 scene.pkg 是编译后的特效程序:图层、父子层级、效果链、HLSL 着色器、视频纹理全打包在里面。这个项目把它们全部解开,在你的浏览器 GPU 上原汁原味重新渲染——不是录屏,不是截图,是每一帧真·执行原作者的 shader。
拿来即用:喂一个
scene.pkg,还你一个会动的 WebGL 画面。
| 模块 | 能力 |
|---|---|
src/pkg/container.js |
scene.pkg 容器解析(PKGV 全版本),UTF-8 条目名(中文场景不白屏) |
src/pkg/texture.js |
TEX 纹理解码:ARGB8888 / RGB888 / RGB565 / DXT1 / DXT3 / DXT5 / RG88 / R8 / LZ4,PNG/JPEG,视频容器(TEXV 内嵌 MP4) |
src/render/hlsl2glsl.js |
HLSL→GLSL 转译器:#include/#define/#if 预处理、combo 语义展开、行向量 mul、标量广播、隐式 int→float、精度统一——独立可复用 |
src/render/renderer.js |
通用 pass 管线:copy → 效果链(FBO 乒乓)→ 合成,与 WE 引擎同构 |
src/scene/parse.js |
场景解析:父子层级世界坐标合并、效果链、parallaxDepth 视差 |
src/scene/effects-parse.js |
效果 material 链解析(effect.json → materials → passes) |
node cli/serve.mjs
# 打开 http://localhost:8123/demo/?id=<WE工坊文件夹id>
# 例如:http://localhost:8123/demo/?id=<你的WE工坊文件夹id>演示页左上角显示真实渲染帧率;demo/diagnostic.html 可检测 WebGL 是显卡还是 CPU 软件渲染(场景卡顿的头号元凶)。
作为库使用:
import { parsePkg, getEntry } from './src/pkg/container.js'
import { parseScene } from './src/scene/parse.js'
import { resolveEffectChain } from './src/scene/effects-parse.js'
import { createRenderer } from './src/render/renderer.js'
const pkg = parsePkg(bytes)
const scene = parseScene(JSON.parse(utf8(getEntry(pkg, 'scene.json'))), null)
const renderer = createRenderer(canvas, {
shaderResolver: async (rel) => utf8(getEntry(pkg, rel)) // 或你自己的 shader 源供给
})
// 加载纹理后:
renderer.render(scene, textures, width, height, time)单独用转译器:
import { hlsl2glsl } from './src/render/hlsl2glsl.js'
const glsl = hlsl2glsl(hlslSource, 'frag', { MY_COMBO: 1 }, async (f) => includeSource)- 不完整 mip 链采样恒黑:WE 容器可能只存部分 mip 级,WebGL 下纹理不完整采样返回纯黑——上传基础级 +
generateMipmap补齐; - HLSL 隐式类型转换:
vec3 - 1、1 - g_Rough、smoothstep(.., 1, ..)在 GLSL 全部非法,转译器按声明类型精确补.0; - 行向量
mul语义:mul(a, b)自动转置为列向量语义; - 标识符保护:
diffx1 * diffy2不会被误伤成diffx1.0; - 父子层级:WE 子对象坐标相对父级,不合并就部件满天飞;
- 无纹理效果层:WE 空层是透明的,白兜底会画出纯白方块。
✅ 2D 场景(图层 + 效果链 + 父子层级 + 视差 + 视频纹理层) 🔜 粒子系统 / 3D 模型 / 组件(时钟、天气)/ 文字对象 / 声音
- dsh-aurora-wallpaper —— 把本引擎接入 DeepSeek Harness 的动态背景插件(本仓库即从中提取)
MIT —— 见 LICENSE。仓库只含代码,不含任何壁纸素材。