GPU Gems 1 · Chapter 31. Using FX Composer
通过 Materials、Scene Graph、Editor、Properties、Textures、Tasks 和 Shader Perf 面板,把 .fx 文件从编辑、编译、调参到场景预览走成一条可验证的 shader 创作工作流。
学习目标
- 能用 Materials、Scene Graph、Editor、Properties、Textures、Tasks 和 Shader Perf 面板完成一次从
.fx到预览的工作流 - 能解释 material 实例、GeoPipe 几何阶段和 scene object 之间的选择与联动关系
- 能利用
UIType、UIName、UIOBJECT等 annotation 把 shader 参数变成可编辑控件或场景对象连接 - 能在编译失败、硬件不支持、资源加载失败和性能异常时选择正确的反馈面板并定位下一步
GPU Gems 1 第 31 章是上一章架构讨论的使用侧补充:它不再讲如何设计 FX Composer 的插件运行时,而是带读者认识一个具体项目如何加载 .fx、创建 material、选择模型、编辑属性、查看纹理、检查 shader 性能并保存工作区。原章面向 FX Composer 1 的 DirectX 9 环境;这里保留它的操作关系与反馈机制,把历史安装步骤转换成今天仍然适用于 shader 工具设计的可验证流程。
↡用于创建 .fx effects、导入模型、编辑材质属性、预览场景并检查 shader 性能的 IDE 式 Direct3D 工具 的核心不是某个单独窗口,而是让多个视图共享当前 scene、material 和编译状态。一个实际任务可以从 Materials panel 开始,也可以从 Scene Graph 选中灯或 geometry,再由 Properties panel 修改它;Editor、Tasks 和 Log 则负责把源码与反馈接回同一条路径。
1. 先建立一个可工作的项目上下文
↡描述 Direct3D 渲染状态、纹理状态、顶点与像素 shader 以及参数的文本效果文件,可被 D3DX effects framework 加载 不只是 shader 函数,它还携带 rendering state、texture state、vertex shader、pixel shader 和参数。FX Composer 可以直接从 .fx 创建 material,也可以打开包含 geometry、materials、textures 和其他元素的 .fxcomposer sample project。
历史版本的启动环境需要 DirectX 9 和随安装器提供的 MEDIA 目录;在学习本章时,重要的是理解依赖关系,而不是把旧安装包当作现代图形项目的必需品:效果文件、模型、纹理、设备能力和编辑器反馈必须同时可观察。
一个稳妥的首次检查顺序是:加载项目,确认 Scene Graph 里有对象,确认 Materials 中能看到 effect,选中 material 查看 Properties,再在 Scene panel 应用它。任何一步失败,都先记录是资源、选择、编译还是设备能力问题,不要用下一层操作掩盖上一层的错误。
2. Materials panel:用可旋转的 3D 调色板验证效果
↡把一个 .fx effect file 与一组独立参数实例化,并在小型 3D 预览物体上显示的 FX Composer 面板 把每个 material 当作一个带参数的 effect 实例。多个 material 可以引用同一个 .fx,但拥有不同的颜色和纹理参数,因此“同类 effect”与“同一个 material”不是一回事。直接打开 .fx 创建 material 是快捷路径,修改 assigned effect 也可以在 Properties panel 完成。
预览物体可以旋转、缩放和更换形状。原书特别强调 3D preview 的理由:光照变化和 bump mapping 往往决定效果是否成立,静态 2D 小图无法暴露这些依赖。红色 wireframe 表示 effect 文件无效,蓝色 wireframe 表示当前图形设备无法运行它;这两个视觉信号都应该触发回到 Editor 或设备能力检查的动作。
3. Scene Graph 与 GeoPipe:从选择对象到几何数据
Scene Graph 用树展示当前 scene,选择其中的 light、shape 或 GeoPipe 后,Properties panel 就能显示该对象的参数。它解决的是“我想改哪个对象”的定位问题;Materials panel 解决的是“这个 effect 在小型预览中长什么样”的问题,两者通过 selection 和 material association 联动。
↡FX Composer 中承载 geometry 的节点及其阶段列表,shape、mesh 和修改器插件按顺序构造最终供 effect 使用的数据 中的数据沿管线流动。一个 sphere plug-in 可以生成多边形,MeshMender 可以生成 tangent-space vectors,更多插件还可以继续添加或变换数据。底部的 shape 或 imported mesh 提供初始 bundle,管线末端将结果交给渲染;因此改变 sphere 的 rings 或 radius 时,Scene panel 可以立即反映几何变化。
GeoPipe 也是自定义导入器的边界:FX Composer 自带 .x 和 .nvb 导入插件,开发者可以为自己的场景格式添加 importer。实践时先检查几何是否完整,再检查 effect 所需的 semantics 是否有对应输入;否则 shader 的错误看起来可能像材质问题,其实是 geometry pipeline 没有提供正确数据。
4. Editor、Compile、Tasks 和 Log:把错误变成下一步
Editor 用语法高亮、Direct3D device state 的 IntelliSense、书签、查找和 Undo/Redo 帮作者维护 .fx 源文件。选择 Materials 中的 material 会自动带出关联文件;修改文件后按 Compile,所有关联 material 才会更新。
edit check3d.fx
→ Compile
→ if Tasks has error: open first location in Editor
→ otherwise inspect Materials and Scene
→ use Shader Perf only after the effect is validTasks panel 是诊断入口:错误可能来自 .fx 编辑、纹理加载失败或当前硬件不支持效果;警告还可能指出无法识别的 semantics 或疑似拼写错误的 annotation。点击编译错误后,Editor 会加载对应文件并突出问题位置。Log panel 则记录项目、material、模型加载和构建等信息,适合确认“工具做了什么”,不应取代 Tasks 的错误定位。
Using FX Composer lab
把一个 `.fx` 改动走完反馈环
先在 Editor 改源文件,再 Compile;只有编译成功,Materials、Scene 和 Properties 才会继续共享 live 状态。实验中的成本是示意值,用来观察联动关系。
Materials 与 Scene 可继续预览,Properties 修改会即时反映到当前帧。
这里的顺序很重要:先让效果有效,再解释效果;先把失败定位到源文件或资源,再调整画面;先确认当前 frame 和绑定关系,再判断参数是否真的发生了变化。
5. Properties panel:从 annotation 到作者友好控件
↡根据 material 或 scene object 的参数元数据生成颜色、数值、向量、矩阵和连接控件,并在当前 key frame 写入修改的面板 是 FX Composer 中最关键的交互面板。选中 material 时,它读取关联 .fx 的参数;选中 sphere 等对象时,它显示尺寸和 tessellation。不可编辑的属性以灰色显示,避免作者把只读状态误认为编译失败。
.fx 中的 annotation 可以改变编辑体验:UIType = color 让颜色显示为颜色控件,UIName 提供人类可读名称,UIOBJECT = POINTLIGHT 则为 lightPos 提供 Parameter dialog,让参数连接到 scene 中的灯。连接后移动灯,材质中的光源位置就会随场景实时变化;也可以断开连接,回到手工编辑。
FX Composer 同时记录当前 key frame。颜色、向量和矩阵在当前帧被修改,并可在其他帧之间插值;播放按钮让带动画的 scene 验证这种时间变化。要避免“控件改了但画面没动”的误判,至少核对三件事:当前对象确实被选中、参数不是灰色只读状态、material 已经重新编译并且绑定仍然有效。
6. Shader Perf 与 Textures:从结果追到成本和中间数据
↡按 technique、pass 和 vertex/pixel shader 查看生成 assembly 及设备 profile 调度信息、用于指导效果性能判断的 FX Composer 面板 不是另一个材质预览,它针对当前 material 选择 technique、pass、vertex 或 pixel shader,并展示生成的 assembly 和 GPU profile 的 scheduling 信息。可以先用它确认某个 pixel shader 的工作,再修改 .fx 并回到 Materials 或 Scene 验证视觉结果。它的报告是特定设备/profile 下的证据,不应被解释成所有 GPU 的固定性能结论。
Textures panel 展示 material 关联的文件纹理、.fx 中生成的 procedural texture 和 render target。以 glow effect 为例,旋转 Materials 中的 material 会让 blur texture 实时更新;把 texture 保存为 .dds 或切到 actual size,可以检查生成结果的像素细节。出现异常时,先判断问题属于 shader 参数、纹理内容、render target 更新还是设备能力。
7. Sample project:验证“各个窗口如何挂在一起”
原章使用 alien_gooch.fxcomposer 作为样例:加载 alien 场景后,在 Materials panel 选中 material,通过 Properties 把颜色改为绿色,再播放到第 10 帧观察动画。更换 material 时,先打开新的 effect,再在 Scene 中选中 alien 并应用它;导入其他模型则走 Import Scene 的 .x 或 .nvb 插件。
这个示例可以抽象为一份可复现的验收清单:
- 载入:工作区恢复 geometry、material、texture 和 scene 状态。
- 选择:Scene Graph 或 Scene panel 能定位目标对象,Materials 能定位关联 material。
- 应用:新 effect 能被应用到模型,Properties 显示可编辑参数和正确的 annotation。
- 观察:动画、纹理、Tasks、Log 和 Shader Perf 都能为当前状态提供证据。
- 保存:Save Project 后重新加载,场景和最后一次设置保持一致。
这里的每一步都可以失败,也都应该有明确的诊断面板。一个工具是否“好用”,不只看它能不能最终画出效果,还看作者能否在中途判断下一步应该打开哪个窗口。
小结:把面板当成一个反馈系统
.fx是包含渲染状态、纹理状态、shader 和参数的 effect 文件;material 是它带独立参数的一次实例化。- Materials 用 3D 预览验证光照和 bump,Scene Graph/Scene 管理对象与几何,GeoPipe 用插件阶段构造输入。
- Editor 的 Compile 把源文件改动传播到关联 material;Tasks 定位错误,Log 记录加载和构建过程。
- Properties 通过
UIType、UIName、UIOBJECT提供作者友好控件、场景绑定和当前 key frame 编辑。 - Shader Perf 追踪 technique/pass/shader 与设备 profile,Textures 观察文件纹理、procedural texture 和 render target。
- Sample project 的价值是验证窗口联动、保存/重载和可恢复反馈,而不是只展示一个漂亮的最终画面。
练习
问题 1|面板选择 你修改了 check3d.fx 的颜色参数,按下 Compile 后 Materials 中仍显示旧颜色。请按最小诊断路径说明应检查哪些面板,以及每个面板能证明什么。
问题 2|参数绑定 一个 lightPos 参数应该始终跟随场景中的 spot light。应使用哪些 annotation 线索?如果艺术家想暂时手工调它,还需要保留什么能力?
问题 3|GeoPipe 与性能证据 为什么不能只在 Materials panel 看到效果就宣布 shader 已经优化?请给出一条包含 GeoPipe 和 Shader Perf 的验证路径。
名词解释
本章出现的专业名词,用大白话再讲一遍。
- FX Composer
- 用于创建、编辑、预览和分析 Direct3D .fx effects 的 IDE 式工具。
- .fx effect file
- 包含渲染状态、纹理状态、顶点与像素 shader 以及参数的文本效果文件。
- Materials panel
- 把 effect 实例显示在可旋转 3D 预览物体上的材质调色板面板。
- GeoPipe
- 由 shape、mesh 和修改器插件按阶段构造 geometry 数据的节点管线。
- Properties panel
- 根据参数元数据编辑 material 或 scene object 属性并管理连接的上下文面板。
- Shader Perf panel
- 按 technique、pass 和 shader 查看生成代码及设备 profile 调度信息的性能面板。