ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

TiXL 的 SetSDFMaterial 算子:为 SDF 着色器图注入颜色的实战指南

TiXL 的 SetSDFMaterial 算子:为 SDF 着色器图注入颜色的实战指南 TiXL 的 SetSDFMaterial 算子为 SDF 着色器图注入颜色的实战指南【免费下载链接】t3TiXL is an open source software to create realtime motion graphics.项目地址: https://gitcode.com/GitHub_Trending/t3/t3本文围绕 TiXLt3 仓库中Lib.field.adjust算子库的SetSDFMaterial算子展开讲解如何在 SDF有符号距离场着色器图里为体素表面注入颜色与材质并结合仓库源码剖析其底层代码生成机制。读完本文你将掌握 SetSDFMaterial 的输入输出语义、默认值与 UI 约束、其与 CombineSDF 协同实现“多颜色混合”的接线方式以及它在着色器编译管线中的真实执行逻辑。一、算子定位Lib.field.adjust中的颜色注入节点SetSDFMaterial 的官方文档位于 .help/docs/operators/lib/field/adjust/SetSDFMaterial.md其核心功能用一句话概括Injects a Color provider into the shader graph.向着色器图注入一个颜色提供者。它归属于Lib.field.adjust算子库。根据该库的 README由算子库自动生成与它同库的算子还有算子功能AbsoluteSDF返回有符号距离场的绝对值InvertSDF反转输入的 SDF 场NoiseDisplaceSDF用 Perlin 类噪声偏移对 SDF 距离做位移PushPullSDF通过向距离加常量使 SDF 体积变厚或变薄SetSDFMaterial向着色器图注入颜色提供者SpatialDisplaceSDF对 SDF 做三维空间扭曲TranslateUV沿 X/Y/Z 轴平移输入 SDF 场的 UV 坐标可以看出adjust一族算子解决的是如何对已经生成的距离场做修正与着色的问题而SetSDFMaterial 是其中唯一专职负责材质/颜色的节点——它不改变几何形状距离值只改变表面颜色。对应的源码实现位于 Operators/Lib/Symbols/field/adjust/SetSDFMaterial.cs算子注册 GUID 为88926602-4694-4632-9fd7-04c8d6ddd728。二、输入参数详解含默认值与 UI 约束原文档给出的输入参数表如下此处结合仓库中的默认值文件与 UI 布局文件做完整展开名称相关性 类型说明SdfFieldShaderGraphNode必填上游的 SDF 场距离场输入ColorFieldShaderGraphNode可选可选的颜色场输入用于以场驱动颜色ColorVector4直接指定的 RGBA 颜色值SdfField必填这是唯一标记为Required的输入。它接收上游 SDF 节点产出的场数据。在源码的TryBuildCustomCode中SetSDFMaterial.cs当SdfField.HasInputConnections为真时会先收集其内嵌着色器代码并且源码注释明确写道Return base distance (required for blending)即必须先把基础距离算出来这是后续 CombineSDF 做混合的前提。ColorField可选一个可选的ShaderGraphNode输入用于提供由场驱动的颜色。它的处理逻辑与SdfField不同它被放入一个带albedo后缀的子上下文sub-context中单独求值详见第四节从而可以接入任何能输出颜色的场节点如噪声、渐变、UV 映射等实现类似表面贴花/渐变着色的效果。ColorVector4直接指定的颜色常量。其默认值记录在算子的默认状态文件 SetSDFMaterial.t3 中DefaultValue: { X: 1.0, Y: 1.0, Z: 1.0, W: 1.0 }即默认白色不透明RGBA 1,1,1,1因此直接拖入算子而不调整任何参数时不会改变原有颜色表现为透明传递。同时UI 布局文件 SetSDFMaterial.t3ui 为Color输入声明了约束Min: 0.0, Max: 1.0, ClampMin: true, ClampMax: true这意味着在编辑器中该颜色分量会被钳制在 [0, 1] 区间内无法输入超过 1 的 HDR 值。若需要 HDR 级高亮应改用ColorField或其他提供更大值域的颜色来源。输入与输出的位置布局同一份.t3ui文件还记录了节点在画布上的输入输出排布SdfField、ColorField、Color三个输入自上而下排列输出Result位于右侧——这有助于你在复杂图结构中快速辨认该节点。三、输出与数据类型名称类型ResultT3.Core.DataTypes.ShaderGraphNode输出类型是T3.Core.DataTypes.ShaderGraphNode即一个可以被继续接入其他着色器图节点的着色器图节点而非最终像素。理解这一点需要知道 TiXL SDF 图内部对场的打包约定场数据以float4表示.rgb携带颜色信息.w携带有符号距离值。这个约定可以从两处源码互相印证在 CombineSDF.cs 中颜色混合使用lerp(f.rgb, f_sub.rgb, GetColorBlendFactor(...))而形状混合使用f.w min(f.w, f_sub.w)在 SetSDFMaterial.cs 中未连接ColorField时直接执行f float4(Color.rgb, f.w)——只替换 RGB 通道保留 w 通道的距离值。因此 SetSDFMaterial 的输出携带颜色的距离场可以继续送入 CombineSDF、Raymarch 或其他 SDF 消费者而不会破坏几何语义。四、工作原理TryBuildCustomCode源码剖析SetSDFMaterial 实现了IGraphNodeOp接口核心逻辑集中在 SetSDFMaterial.cs 的TryBuildCustomCode方法中。该方法在着色器代码装配阶段被调用向最终的 SDF 求值函数追加代码片段。整个装配过程借助 CodeAssembleContext.cs 完成——它维护一个Calls字符串构建器收集距离函数代码并通过PushContext/PopContext引入局部变量p{id}与f{id}来隔离作用域见 CodeAssembleContext.cs。第一步收集上游距离场代码if (SdfField.HasInputConnections) { ShaderNode.InputNodes[inputNodeIndex]?.CollectEmbeddedShaderCode(c); inputNodeIndex; }将上游 SDF 的求值代码内嵌进来得到当前上下文的基础距离f.w即return base distance, required for blending。第二步材质作用域门控c.AppendCall($if(p{c}.w 0.5 p{c}.w 1.5) {{);从生成的代码看节点会依据p.w随位置携带的标记值判断当前采样点是否落在(0.5, 1.5)区间内只有满足该条件才执行材质注入。可以推断这是 TiXL 用来区分不同材质带/图层的约定机制用于在多次注入时只影响指定的表面带。第三步颜色注入的两种分支分支 A——连接了ColorField场驱动颜色c.PushContext(subContextIndex, albedo); // ...收集 ColorField 的内嵌着色器代码... c.PopContext(); c.AppendCall($f{c}.rgb f{subContextId}.rgb * {ShaderNode}Color.rgb;);ColorField在独立的albedo子上下文中求值得到f_albedo.rgb再与Color参数的 RGB 分量逐通道相乘。这提供了一种便捷的调制方式用ColorField给出空间变化的颜色如噪声、渐变用Color做整体 tint染色。分支 B——未连接ColorField常量颜色c.AppendCall($f{c} float4({ShaderNode}Color.rgb, f{c}.w););直接用Color参数的 RGB 覆盖当前颜色同时原样保留距离值f.w。这正是上一节所述只改颜色、不动几何的底层来源。运行时更新路径在运行时算子的构造函数创建ShaderGraphNode并将Result.UpdateAction绑定到UpdateSetSDFMaterial.cs每次求值都会调用ShaderNode.Update(context)触发上游与自身的参数刷新。需要说明的是TryBuildCustomCode本身不做运行时计算它只在着色器代码重建时参与代码生成真正逐像素的着色由最终编译出的 SDF 求值函数完成。五、与 CombineSDF 协同实现多颜色混合原文档特别指出There can be multiple colors which can be mixed with [CombineSDF]可以有多个颜色它们可以通过 CombineSDF 混合在一起这是 SetSDFMaterial 最典型的应用场景一个组合造型中的不同部分各自着色再通过 CombineSDF 在颜色与几何两个维度上统一混合。CombineSDF 的文档位于 .help/docs/operators/lib/field/combine/CombineSDF.md其输入为名称相关性 类型说明InputFieldsShaderGraphNode必填多输入两个或更多待组合的场KSingle混合半径/锐度系数CombineMethodInt32组合方式枚举从其源码 CombineSDF.cs 可以看到共支持13 种组合方式并集类Union、UnionSoft、UnionRound、UnionChamfer、UnionSmooth差集类CutOut、CutOutRound、CutOutChamfer交集类Intersect、IntersectRound、IntersectChamfer特效类Pipe沿交线生成管道、Engrave在第一个物体上雕刻 V 形槽关键点在于CombineSDF 的GetPostShaderCodeCombineSDF.cs同时处理颜色与距离两个通道f{contextId}.rgb lerp(f{contextId}.rgb, f{subContextId}.rgb, GetColorBlendFactor(f{contextId}.w, f{subContextId}.w, K)); // 然后依据 CombineMethod 组合距离 f{contextId}.w min(f{contextId}.w, f{subContextId}.w); // Union f{contextId}.w fOpSmoothUnion(f{contextId}.w, f{subContextId}.w, K); // UnionSmooth // ...颜色通过lerp与GetColorBlendFactor以两个场的距离与K为输入加权过渡距离则按所选布尔运算组合。这意味着只要在混合前用 SetSDFMaterial 分别给各部件着色CombineSDF 就能在平滑融合几何的同时自动过渡颜色避免出现几何圆滑但颜色硬切的破绽。仓库中还提供了可运行示例 CombineSDFExample.cs配套.t3/.t3ui位于同目录可以直接作为在 TiXL 编辑器中观察颜色混合效果的起点。六、实战接线示例下面以文字描述两种典型的图拓扑均可在 TiXL 编辑器中以图形化方式搭建场景一两个 SDF 部件各自着色后平滑混合[SphereSDF] → SetSDFMaterial(Color红) ┐ ├→ CombineSDF(CombineMethodUnionSmooth, K0.1) → 下游 Raymarch/渲染 [BoxSDF] → SetSDFMaterial(Color蓝) ┘要点两条支路各自用 SetSDFMaterial 注入不同颜色CombineSDF 的InputFields是多输入MultiInputSlotShaderGraphNode可同时接入两个已着色的场调整K控制过渡带宽度GetColorBlendFactor会依据距离差在红蓝之间做平滑插值。场景二用 ColorField 做空间渐变着色[NoiseField / UV 相关场] → SetSDFMaterial.ColorField [SdfField] → SetSDFMaterial.SdfField SetSDFMaterial.Color → 整体 tint默认白1,1,1,1要点将噪声、渐变等颜色提供者接入ColorField其输出会在albedo子上下文中独立求值再与Color逐通道相乘由于Color在 UI 上被钳制在[0,1]需要更大动态范围时可通过ColorField提供未连接ColorField时算子表现为纯常量着色可作为最轻量的调色板节点复用。七、相关资源索引算子文档.help/docs/operators/lib/field/adjust/SetSDFMaterial.md、库目录 .help/docs/operators/lib/field/adjust/README.md算子源码Operators/Lib/Symbols/field/adjust/SetSDFMaterial.cs默认状态含 Color 默认值Operators/Lib/Symbols/field/adjust/SetSDFMaterial.t3UI 布局含输入位置与 Color 钳制范围Operators/Lib/Symbols/field/adjust/SetSDFMaterial.t3ui混合算子源码/文档Operators/Lib/Symbols/field/combine/CombineSDF.cs、.help/docs/operators/lib/field/combine/CombineSDF.md可运行示例Operators/examples/Symbols/lib/field/combine/CombineSDFExample.cs着色器代码装配基础设施Core/DataTypes/ShaderGraph/CodeAssembleContext.cs以上文档均由算子库自动生成见 adjust README 末尾的Auto-generated from the operator library.标注与源码保持同步是理解 TiXL SDF 着色器图最可靠的入口。【免费下载链接】t3TiXL is an open source software to create realtime motion graphics.项目地址: https://gitcode.com/GitHub_Trending/t3/t3创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表