Forge项目中的Dyno着色器系统深度解析
2025-06-04 14:49:50作者:贡沫苏Truman
概述
Forge项目中的dyno
着色器图系统是一个革命性的GPU计算框架,它允许开发者使用JavaScript(可选GLSL)创建自定义计算图,这些计算图最终会被编译为GLSL并在GPU上执行。这一系统类似于现代3D图形引擎中的着色器图系统,但提供了更高级的抽象和类型安全保证。
核心概念
Dyno计算单元
Dyno
类及其子类是系统的核心构建块,可以将其视为具有多个类型化输入和输出的函数模块。这些模块之间传递的值类型为DynoVal<T>
,其中T
必须是DynoType
,代表GLSL中的GPU类型。
关键特性:
- 类型安全:通过TypeScript确保GPU计算图的类型正确性
- 静态验证:在编译前就能捕获类型错误
- 可组合性:可以自由组合现有模块或创建自定义模块
类型系统
DynoType
可以是:
- 内置GLSL类型(如
"int"
、"float"
、"vec"
等) - 用户自定义类型(如
{ type: "MyType" }
)
内置类型分类
- 单值类型:
"int"
、"uint"
、"float"
、"bool"
- 向量类型:
"vec4"
、"ivec3"
、"bvec2"
- 矩阵类型:
"mat4"
、"mat2x3"
- 采样器类型:
"sampler2D"
、"usampler3D"
等
自定义类型示例
Forge定义了几个有用的自定义类型:
Gsplat
:表示一个完整的splat参数TPackedSplats
:高效存储的splat集合SdfArray
:有符号距离场数组TRgbaArray
:RGBA值数组SplatSkinning
:splat蒙皮相关数据
实际应用场景
Forge目前主要在以下两个场景中使用Dyno系统:
- 动态splat生成:通过
SplatGenerator
/SplatMesh
动态生成场景中的splat - splat距离度量计算:为CPU回读和排序计算splat距离度量
底层执行机制
这些操作通过以下类作为伪计算着色器执行:
PackedSplats
:以16字节/splat的高效格式存储splat集合Readback
:将索引映射到RGBA8值,生成可读回CPU的32位值
Dyno值类型详解
值类型分类
-
字面量(DynoLiteral):
- 直接提供GLSL字面量字符串
- 示例:
new DynoLiteral("float", "1.0")
-
常量(DynoConst):
- 提供JavaScript值,自动转换为GLSL字面量
- 示例:
new DynoConst("vec3", new THREE.Vector3(1.0, 2.0, 3.0))
-
输出值(DynoOutput):
- 表示Dyno块的特定命名输出
- 示例:
const { opacity } = dyno.splitGsplat(gsplat)
Dyno块设计与实现
构造函数选项
选项 | 描述 |
---|---|
inTypes |
输入名称到类型的映射 |
outTypes |
输出名称到类型的映射 |
inputs |
输入值的映射 |
update |
每次执行前调用的更新函数 |
globals |
提供所需全局GLSL定义的函数 |
statements |
提供执行GLSL语句的函数 |
generate |
编译器调用的生成函数 |
生成上下文(GenerateContext)
属性 | 描述 |
---|---|
inputs |
输入键到实际GLSL变量名的映射 |
outputs |
输出键到实际GLSL变量名的映射 |
compile |
编译上下文实例 |
使用模式
// 基本用法
const { sum } = new dyno.Add({ a, b }).outputs;
// 简化写法
const { sum } = dyno.add(a, b).outputs;
// 单输出简化
const sum = dyno.add(a, b);
高级功能:DynoBlock
DynoBlock
是一种特殊的Dyno,可以包含内部子图。推荐使用dynoBlock
辅助函数创建:
const generator = dyno.dynoBlock(
{ index: "int" }, // 输入
{ gsplat: Gsplat }, // 输出
({ index }) => { // 子图构建
let gsplat = dyno.readPackedSplat(myPackedSplats, index);
const opacity = dyno.dynoConst("float", 1.0);
gsplat = dyno.combineGsplat({ gsplat, opacity });
return { gsplat };
}
);
开发辅助工具
-
代码格式化工具:
unindentLines
:处理多行字符串,移除公共前导空格unindent
:同上,但返回单个字符串
-
操作符辅助类:
UnaryOp
:一元操作BinaryOp
:二元操作TrinaryOp
:三元操作
学习建议
对于初学者,建议从以下方面入手:
- 研究粒子模拟示例
- 分析
SplatMesh.constructGenerator()
的复杂图结构 - 探索
SplatMesh
的两个注入点:objectModifier
:渲染前修改splat对象worldModifier
:修改现有splat对象
通过掌握这些概念和工具,开发者可以充分利用Forge的Dyno系统创建高效、类型安全的GPU计算图,为图形应用带来前所未有的灵活性和性能。
登录后查看全文
热门项目推荐
HunyuanImage-3.0
HunyuanImage-3.0 统一多模态理解与生成,基于自回归框架,实现文本生成图像,性能媲美或超越领先闭源模型00ops-transformer
本项目是CANN提供的transformer类大模型算子库,实现网络在NPU上加速计算。C++045Hunyuan3D-Part
腾讯混元3D-Part00GitCode-文心大模型-智源研究院AI应用开发大赛
GitCode&文心大模型&智源研究院强强联合,发起的AI应用开发大赛;总奖池8W,单人最高可得价值3W奖励。快来参加吧~0289Hunyuan3D-Omni
腾讯混元3D-Omni:3D版ControlNet突破多模态控制,实现高精度3D资产生成00GOT-OCR-2.0-hf
阶跃星辰StepFun推出的GOT-OCR-2.0-hf是一款强大的多语言OCR开源模型,支持从普通文档到复杂场景的文字识别。它能精准处理表格、图表、数学公式、几何图形甚至乐谱等特殊内容,输出结果可通过第三方工具渲染成多种格式。模型支持1024×1024高分辨率输入,具备多页批量处理、动态分块识别和交互式区域选择等创新功能,用户可通过坐标或颜色指定识别区域。基于Apache 2.0协议开源,提供Hugging Face演示和完整代码,适用于学术研究到工业应用的广泛场景,为OCR领域带来突破性解决方案。00- HHowToCook程序员在家做饭方法指南。Programmer's guide about how to cook at home (Chinese only).Dockerfile09
- PpathwayPathway is an open framework for high-throughput and low-latency real-time data processing.Python00
热门内容推荐
1 freeCodeCamp英语课程填空题提示缺失问题分析2 freeCodeCamp全栈开发课程中React实验项目的分类修正3 freeCodeCamp课程中屏幕放大器知识点优化分析4 freeCodeCamp论坛排行榜项目中的错误日志规范要求5 freeCodeCamp音乐播放器项目中的函数调用问题解析6 freeCodeCamp JavaScript高阶函数中的对象引用陷阱解析7 freeCodeCamp英语课程视频测验选项与提示不匹配问题分析8 freeCodeCamp课程视频测验中的Tab键导航问题解析9 freeCodeCamp博客页面工作坊中的断言方法优化建议10 freeCodeCamp课程页面空白问题的技术分析与解决方案
最新内容推荐
QT连接阿里云MySQL数据库完整指南:从环境配置到问题解决 SteamVR 1.2.3 Unity插件:兼容Unity 2019及更低版本的VR开发终极解决方案 Windows版Redis 5.0.14下载资源:高效内存数据库的完美Windows解决方案 PANTONE潘通AI色板库:设计师必备的色彩管理利器 CS1237半桥称重解决方案:高精度24位ADC称重模块完全指南 ReportMachine.v7.0D5-XE10:Delphi报表生成利器深度解析与实战指南 瀚高迁移工具migration-4.1.4:企业级数据库迁移的智能解决方案 PhysioNet医学研究数据库:临床数据分析与生物信号处理的权威资源指南 SAP S4HANA物料管理资源全面解析:从入门到精通的完整指南 OMNeT++中文使用手册:网络仿真的终极指南与实用教程
项目优选
收起

deepin linux kernel
C
22
6

OpenHarmony documentation | OpenHarmony开发者文档
Dockerfile
165
2.05 K

Nop Platform 2.0是基于可逆计算理论实现的采用面向语言编程范式的新一代低代码开发平台,包含基于全新原理从零开始研发的GraphQL引擎、ORM引擎、工作流引擎、报表引擎、规则引擎、批处理引引擎等完整设计。nop-entropy是它的后端部分,采用java语言实现,可选择集成Spring框架或者Quarkus框架。中小企业可以免费商用
Java
8
0

🎉 (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue3 & Vite、Element Plus 的前后端分离权限管理系统
Vue
954
563

🔥LeetCode solutions in any programming language | 多种编程语言实现 LeetCode、《剑指 Offer(第 2 版)》、《程序员面试金典(第 6 版)》题解
Java
60
16

基于golang开发的网关。具有各种插件,可以自行扩展,即插即用。此外,它可以快速帮助企业管理API服务,提高API服务的稳定性和安全性。
Go
22
0

喝着茶写代码!最易用的自托管一站式代码托管平台,包含Git托管,代码审查,团队协作,软件包和CI/CD。
Go
17
0

本仓将收集和展示仓颉鸿蒙应用示例代码,欢迎大家投稿,在仓颉鸿蒙社区展现你的妙趣设计!
Cangjie
408
387

为非计算机科班出身 (例如财经类高校金融学院) 同学量身定制,新手友好,让学生以亲身实践开源开发的方式,学会使用计算机自动化自己的科研/创新工作。案例以量化投资为主线,涉及 Bash、Python、SQL、BI、AI 等全技术栈,培养面向未来的数智化人才 (如数据工程师、数据分析师、数据科学家、数据决策者、量化投资人)。
Python
77
71

无需学习 Kubernetes 的容器平台,在 Kubernetes 上构建、部署、组装和管理应用,无需 K8s 专业知识,全流程图形化管理
Go
14
1