news 2026/8/26 15:20:33

volrend Web部署指南:用emscripten构建WASM版浏览器NeRF查看器的完整流程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
volrend Web部署指南:用emscripten构建WASM版浏览器NeRF查看器的完整流程

volrend Web部署指南:用emscripten构建WASM版浏览器NeRF查看器的完整流程

【免费下载链接】volrendPlenOctree Volume Rendering (supports CUDA & fragment shader backends)项目地址: https://gitcode.com/gh_mirrors/vo/volrend

volrend 是一个实时 PlenOctree 体渲染器,用 C++ 和 OpenGL 编写,可实时渲染 NeRF(神经辐射场)场景。借助 emscripten 工具链,volrend 能把整个渲染引擎编译成 WebAssembly(WASM),让你在浏览器里直接运行 NeRF 查看器,无需安装任何软件。本文将带你完成 volrend Web 版从环境安装、CMake 构建、本地预览到上线部署的完整流程。

🎯 volrend 的 Web 版能做什么

volrend 官方 Web 版使用片元着色器后端(而非 CUDA 后端)构建,核心能力包括:

  • 交互式 NeRF 查看:鼠标/触屏旋转、平移、缩放,实时查看 PlenOctree 场景
  • 远程数据加载:通过 emscripten fetch API 在线拉取压缩后的.npz八叉树文件
  • 本地文件打开:支持在浏览器里加载本地的.npz树文件、.obj网格和 drawlist 文件
  • 丰富的可视化选项:切片渲染(Slicing)、SH 分解、伪重光照、八叉树网格、FPS 统计等

桌面版的渲染效果可以参考下图(乐高场景的体渲染切片视图,Web 版交互能力相同):

🛠️ 第一步:准备 emscripten 构建环境

Web 版构建依赖 emscripten 官方文档 所述的标准安装方式,你需要:

  1. 安装 emscripten 官方文档 所述的 SDK(推荐用emsdk一键安装)
  2. 确保系统中有CMake(3.3+)和Python 3(构建脚本会用到)
  3. 克隆项目(含子模块):
git clone https://gitcode.com/gh_mirrors/vo/volrend volrend cd volrend

💡 关键点:volrend 的CMakeLists.txt内置了完整的 emscripten 分支逻辑——只要检测到 EMSCRIPTEN 编译器,就会自动关闭 CUDA、切换为片元着色器后端,并把着色器shaders/rt.frag内联进代码,无需任何手动修改。

🚀 第二步:用 emcmake 三步构建 WASM 版

volrend 的构建脚本把网页所需的 HTML/CSS/JS/WASM 全部自动化了,构建只有三步:

mkdir embuild && cd embuild emcmake cmake .. make -j12

构建完成后,完整的网站会写到embuild/build/目录,结构如下:

  • build/index.html—— 页面入口,自动注入版本号
  • build/js/main.js—— 由 5 个 JS 文件 + WASM 胶水代码自动拼接而成
  • build/js/volrend_web.wasm—— 真正的 WASM 渲染引擎
  • build/css/main.css—— 页面样式

这套自动化来自CMakeLists.txt中的 emscripten 分支(约第 284–356 行),它配置了关键编译参数:USE_WEBGL2=1(启用 WebGL2)、USE_GLFW=3(用 GLFW 模拟浏览器窗口)、ALLOW_MEMORY_GROWTH=1(内存可增长,初始 512MB)。构建时还会自动执行web/autoversion.py给 JS/CSS 加上随机版本号,解决浏览器缓存问题

🖥️ 第三步:本地启动预览

volrend 内置了一个serve构建目标,直接调用 Python 的 HTTP 服务器预览:

cd embuild make serve

然后在浏览器打开http://0.0.0.0:8000/即可看到 PlenOctree Viewer 界面。

页面前端逻辑位于web/目录:

  • web/index.html—— 导航栏、选项面板、图层面板、加载进度条
  • web/js/init.js—— 鼠标/触屏/键盘事件桥接,把输入转发给 WASM 端
  • web/js/emModule.js—— emscripten 运行时配置与进度回调
  • web/js/guiComponents.js—— 选项滑块、图层 UI
  • web/main_web.cpp—— C++ 侧的 Web 入口,负责 OpenGL 初始化、数据加载与 JS 绑定

📂 加载场景:远程 URL 与本地文件两种方式

方式一:URL 参数自动加载。web/js/init.js支持在地址栏追加参数,页面启动后自动下载并渲染:

index.html?load=scene.npz

多个文件用;分隔,如?load=tree.npz;camera.draw.npz。加载器会按扩展名自动判断:.obj走网格加载、.draw.npz走 drawlist、其余按八叉树处理(见web/main_web.cpp中的load_remote函数)。

方式二:Load Local 手动加载。点击导航栏的Open Local按钮,选择本地.npz.obj文件。JS 会把文件读入 emscripten 的虚拟文件系统(MEMFS),再交给 C++ 端解析——这也是CMakeLists.txtFORCE_FILESYSTEM=1参数的用途。

⚙️ 使用指南:常用交互与选项

进入页面后,常用操作如下:

操作说明
鼠标左键拖动绕相机位置旋转视角
鼠标右键拖动绕原点旋转
滚轮 / 双指捏合前后移动 / 触屏缩放
16切换 world_up 方向,适配不同坐标系的数据
T开关 FPS 计数
Options面板渲染质量(high speed / moderate / high quality)、切片包围盒、SH 分解范围、伪重光照、八叉树网格显示
Layers面板显示/隐藏相机层、网格层

🌐 第四步:部署到静态服务器

由于build/目录是完全自包含的静态资源,部署非常简单:

  1. 把整个embuild/build/目录上传到任意静态托管(Nginx、Apache、GitHub Pages 风格的静态服务器均可)
  2. 确保服务器允许跨域加载.wasm(多数现代服务器默认支持)
  3. 把场景.npz文件放在同域下(或确保允许跨域访问),即可通过?load=xxx.npz分享链接

⚠️提示:WebGL2 渲染对浏览器 GPU 有要求,建议在带独立显卡的电脑上体验完整效果。

📦 进阶:压缩你的数据再上线

浏览器加载数据对体积敏感,volrend 提供了压缩脚本scripts/compress_octree.py,通过中值切割量化(svox 库)+ deflate 把原始.npz压缩到 Web 可用的体积:

pip install svox python scripts/compress_octree.py scene.npz --out_dir webdata --retain 4

--retain 4表示保留前 4 个 SH 系数不量化,部分场景需要此参数保证质量。压缩后的文件仍可直接被 volrend 打开,把它放进部署目录即可被 Web 查看器加载。

❓ 常见问题

Q1:构建时报 "A submodule has not downloaded!" 怎么办?执行git submodule update --init --recursive后再重新构建。GLFW 等第三方库以子模块形式包含在3rdparty/目录中。

Q2:Web 版和桌面版功能有差异吗?有。Web 版基于片元着色器后端,比 CUDA 后端慢一些,且不支持网格插入相关功能(如 lumisphere probe 探针)。

Q3:页面打开后一直转圈?先检查浏览器是否支持 WebGL2;再看控制台是否有.wasm.npz的 404 错误——静态服务器必须正确提供build/下所有文件。

✅ 小结

回顾 volrend Web 部署的核心路径:

  1. 安装 emscripten SDK
  2. emcmake cmake .. && make -j12一键产出静态网站
  3. make serve本地预览
  4. build/目录扔到任何静态服务器
  5. ?load=xxx.npz参数或 Load Local 加载场景

整个过程不到 10 分钟,你就能拥有一个免安装的浏览器 NeRF 查看器,把 volrend 的实时 PlenOctree 体渲染能力分享给任何人 🎉

【免费下载链接】volrendPlenOctree Volume Rendering (supports CUDA & fragment shader backends)项目地址: https://gitcode.com/gh_mirrors/vo/volrend

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/26 15:17:39

UVM 句柄与对象:为什么 reg_model 在 env 但 vsequencer 有句柄?

对象在哪里创建,句柄在哪里可见? 在 UVM 验证环境中,我们经常看到这样的现象:reg_model 对象在 env 的 build_phase 中创建,但在 test 层可以直接通过 env.reg_model 访问它;而 vsequencer 中也持有各个 re…

作者头像 李华
网站建设 2026/8/26 15:15:43

基于springboot房屋租赁系统的设计与实现源码+文档

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

作者头像 李华
网站建设 2026/8/26 15:13:17

基于springboot小说在线阅读平台源码+文档

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

作者头像 李华
网站建设 2026/8/26 15:12:05

ModelManager + Bmc:rust-web-app数据访问层的设计哲学与实战

ModelManager Bmc:rust-web-app数据访问层的设计哲学与实战 【免费下载链接】rust-web-app Code template for a production Web Application using Axum: The AwesomeApp Blueprint for Professional Web Development. 项目地址: https://gitcode.com/gh_mirror…

作者头像 李华
网站建设 2026/8/26 15:12:03

CSP-J 初赛(以满分为目标):第八课《数组、字符串与常见数据结构——程序里的“储物柜”:一格一格存数据》

第八课 数组、字符串与常见数据结构——程序里的“储物柜”:一格一格存数据这一课是从“单个变量”走向“一组数据”的关键一步。本课要解决一个新问题:如果我要同时保存100个、1000个数据怎么办?这就进入了数组、字符串以及线性数据结构。一…

作者头像 李华