TiXL Lib.field.render 渲染算子全解析:RaymarchField、Render2dField 与 SampleFieldPoints 实战指南

发布时间:2026/9/19 16:19:36
TiXL Lib.field.render 渲染算子全解析:RaymarchField、Render2dField 与 SampleFieldPoints 实战指南
TiXL Lib.field.render 渲染算子全解析RaymarchField、Render2dField 与 SampleFieldPoints 实战指南【免费下载链接】t3TiXL is an open source software to create realtime motion graphics.项目地址: https://gitcode.com/GitHub_Trending/t3/t3本篇技术指南聚焦 TiXL 实时动态图形软件中Lib.field.render渲染算子族系统讲解如何把 ShaderGraph 定义的 SDF有向距离场与二维颜色场真正渲染到画面、以及如何将场数据采样回粒子系统的三个核心算子RaymarchField、Render2dField与SampleFieldPoints。读完本文你将掌握每个算子的全部输入参数与默认值、底层渲染管线的实现原理深度写入、混合、计算着色器线程调度并能够直接搭建生成 SDF → 渲染/采样 → 合成到 3D 场景的完整工作流。一、Lib.field.render 是什么在 TiXL 的场Field体系中Lib.field命名空间按职责划分为多个子库其中Lib.field.render专门负责把 ShaderGraph 中定义的场数据变成可见的渲染结果。这一组的入口索引位于 .help/docs/operators/lib/field/render/README.md目前包含三个算子算子功能官方一句话描述RaymarchField将 ShaderGraph SDF 光线步进渲染为 3D 几何Renders the connected shader graph SDFRender2dField将 2D 颜色场渲染进纹理Renders a 2d color field into a textureSampleFieldPoints在点集上采样场数据并写回—三者分别对应3D 渲染2D 渲染数据回读三种场景源码实现位于 Operators/Lib/Symbols/field/render/每个算子均由.cs算子逻辑、.t3默认值与内部子图连接和.t3ui界面布局三部分构成是 TiXL 运算符库的标准组织方式。二、RaymarchField将 SDF 场渲染为 3D 几何2.1 用途与别名RaymarchField 是Lib.field.render中最核心的算子它接收一个 ShaderGraph 类型的 SDF 场SdfField输入通过光线步进raymarching算法沿摄像机射线逐步采样距离场重建出三维表面并着色。官方文档明确指出Renders the connected shader graph SDF. It uses the following SetMaterial、[SetFog] 与 [PointLight] 的 override。它会正确初始化深度缓冲使输出可以与网格mesh等其他几何体混合。也就是说RaymarchField 渲染出的 SDF 表面会正确参与场景深度测试与 Z 写入可以与普通网格模型混排在同一画面中。该算子有多个历史别名DrawField、DrawSDF、DrawRaymarchField、RaymarchSDF在旧项目或社区示例中遇到这些名字时指的都是同一个算子。2.2 输入参数与默认值全表结合 RaymarchField.md 的参数说明与 RaymarchField.t3 中记录的默认值整理如下参数名类型默认值说明SdfFieldShaderGraphNode必需null要渲染的 SDF 场通常连接Lib.field.generate.sdf系列算子ColorVector4(1, 1, 1, 1)颜色乘数。也可以用 SetSDFMaterial / SetMaterial 实现同样效果AmbientOcclusionVector4(1e-06, 1e-06, 1e-06, 1.0)根据 AoDistance 施加的环境光遮蔽颜色alpha 通道控制强度。尝试使用灯光颜色可以产生类似内发光inner glow的效果AoDistanceSingle1.0控制环境光遮蔽的作用距离与强度TextureScaleSingle1.0缩放由 SetMaterial 定义的纹理的 UVUVMappingInt321场的 UV 生成模式枚举见下节NormalSamplingDSingle0.002计算表面法线时的查表距离控制物体边缘的锐利程度。值过小会产生伪影较大值则有平滑效果MaxStepsSingle100.0光线步进的步数对画质与性能影响最大。正常取值范围 50–150MinDistanceSingle0.002步进判定完成的距离阈值MaxDistanceSingle300.0超过此距离后中止步进StepSizeSingle1.0步长的初始缩放系数。调低可减少因无效 Lipschitz 连续如叠加噪声导致的伪影DistToColorSingle0.15用于减少合成到场景时边缘伪影的微调因子WriteDepthBooleantrue是否写入深度缓冲默认开启以便与场景几何正确混合SpecularAASingle0.5高光区域的抗锯齿强度2.3 UVMapping 的五种生成模式UVMapping参数在源码中映射为枚举MappingModes见 RaymarchField.cs 的私有枚举定义private enum MappingModes { Global_Triplanar, // 0全局三平面投影 Local_Triplanar, // 1局部三平面投影默认 Local_XY, // 2局部 XY 平面 Local_YZ, // 3局部 YZ 平面 Local_XZ, // 4局部 XZ 平面 }Triplanar三平面模式会同时从三个轴向投影采样纹理并按法线加权混合适合不规则的 SDF 表面避免单一平面投影在侧面拉伸Local_XY / YZ / XZ模式则是单平面投影适合有明显主朝向的平面类表面。从 RaymarchField.t3 的内部连接可以看到UVMapping 输入被连接到PickStringPart算子根据所选枚举值挑选对应的宏定义MAPPING_GLOBAL_TRIPLANAR、MAPPING_LOCAL_TRIPLANAR、MAPPING_XY、MAPPING_XZ、MAPPING_YZ再作为AdditionalDefines注入 ShaderGraph 代码生成过程——这就是参数能改变着色器行为的具体实现路径。2.4 渲染管线内部实现从 RaymarchField.t3 的子图结构可以还原其完整渲染管线着色器来源顶点着色器使用RaymarchSDFFieldTemplate.hlsl入口点vsMain4像素着色器使用RaymarchSDFFieldWithMatTemplate.hlsl入口点psMain着色器代码由GenerateShaderGraphCode依据 SdfField 输入动态生成几何绘制Draw算子以 6 个顶点绘制全屏三角形配合InputAssemblerStage与RasterizerCullMode 设为 None、FrontCounterClockwise 开启完成光栅化深度与混合DepthStencilState默认开启 Z 写入EnableZWritetrue与 Z 测试EnableZTesttrueComparisonLessEqualBlendState通过BlendOnWhites开启混合BlendEnabledtrue混合模式由BlendColorsMode1驱动——这正是文档所述正确初始化深度缓冲、可与网格混合的底层依据材质参数GetPbrParameters提供 PBR 材质参数GetForegroundColor提供前景色配合FloatsToBuffer将步进参数MaxSteps、StepSize、MinDistance、MaxDistance、NormalSamplingD 等打包进常量缓冲。2.5 RaymarchField 调参实战建议结合文档说明与默认值给出以下实用调参路径先看大体形状保持 MaxSteps100、MinDistance0.002、MaxDistance300 不动调整 SdfField 的形状参数画质与性能平衡MaxSteps 是关键。表面细节丢失就往上调100→150性能吃紧就往下调100→50文档特别提示 50–150 为正常区间出现闪烁/破损伪影优先考虑降低StepSize如 1.0 → 0.5文档明确说明这对因无效 Lipschitz 连续性典型如对 SDF 叠加噪声后造成的伪影有效法线过锐或过糊调整NormalSamplingD过小会产生采样伪影过大则有平滑化效果默认 0.002 是通用起点物体边缘在合成时发虚微调DistToColor默认 0.15减少边缘伪影想要内发光效果按文档建议给AmbientOcclusion传入灯光色并调高 alpha 通道强度。2.6 输出输出名类型说明DrawCommandT3.Core.DataTypes.Command渲染命令连接到输出绘制链如摄像机/渲染目标ShaderCodeSystem.String动态生成的着色器源码便于调试或复用其中ShaderCode输出在 RaymarchField.cs 中定义为Slotstring并连接到GenerateShaderGraphCode的结果排查着色器报错时可以直接查看该字符串。三、Render2dField把 2D 颜色场渲染进纹理3.1 用途Render2dField 与 RaymarchField 的区别在于它渲染的是二维颜色场ColorField输入ShaderGraphNode 类型而不是三维 SDF。官方描述为Renders a 2d color field into a texture.从 Render2dField.cs 的源码看它的输入参数包含大量与 RaymarchField 相同的步进参数MaxSteps、StepSize、MinDistance、MaxDistance可以推断其内部同样采用步进/追踪式渲染只是作用于 2D 场因此典型用途是把程序化生成的 2D 场如噪声、图案渲染为纹理供其他节点采样。3.2 输入参数全表参数名类型说明MaxStepsSingle最大步数StepSizeSingle步长初始缩放系数MinDistanceSingle步进完成阈值MaxDistanceSingle步进中止阈值SpecularVector4高光颜色Glow_Vector4辉光颜色AmbientOcclusionVector4环境光遮蔽颜色BackgroundVector4背景颜色SpecVector2高光相关参数如强度/粗糙度AoDistanceSingleAO 作用距离FogSingle雾效强度LightPosVector3光源位置DistToColorSingle距离到颜色的映射因子ColorFieldShaderGraphNode要渲染的 2D 颜色场3.3 与 RaymarchField 的对照两者的参数高度同源步进三件套 MaxSteps / MinDistance / MaxDistance AO 与 DistToColor区别在于输入场类型RaymarchField 吃 SDF返回带距离信息的场Render2dField 吃颜色场光照模型Render2dField 自带 Specular / Glow / LightPos / Fog 等纯 2D 光照参数而 RaymarchField 依赖场景中的 SetFog、PointLight override输出Render2dField 只有一个DrawCommand输出类型同为 T3.Core.DataTypes.Command不暴露 ShaderCode。3.4 典型用法将Lib.field.generate系列生成的 2D 场连接到ColorField再用Background控制底色、Glow_控制亮部辉光、LightPos移动光源位置即可得到一张可随时重绘的程序化纹理DrawCommand输出连接到渲染目标后即可呈现。四、SampleFieldPoints在场中批量采样并写回粒子4.1 用途SampleFieldPoints 承担数据回读职责它把一组点PointsBufferWithViews 类型逐个送入场FieldShaderGraphNode 类型求值再把采样得到的距离值写回点的附加通道供下游算子如按距离改变粒子大小、颜色或运动使用。这在粒子系统中非常实用——例如让粒子流沿 SDF 表面运动或让粒子避开/贴近场定义的几何。4.2 输入输出输入类型说明PointsBufferWithViews必需待采样的点集通常来自粒子系统或点生成算子FieldShaderGraphNode必需用于采样的场可以是 SDF 场WriteToInt32写回通道选择枚举见下输出类型说明Result2T3.Core.DataTypes.BufferWithViews采样后携带新数据的点集WriteTo参数映射自源码中的FModes枚举见 SampleFieldPoints.csprivate enum FModes { None, // 0不写入 F1, // 1写入 FX1 通道 F2, // 2写入 FX2 通道 }4.3 计算着色器实现原理采样过程在 GPU 上以计算着色器完成模板位于 Operators/Lib/Assets/shaders/field/use/SampleFieldPointsTemplate.hlsl关键实现如下[numthreads(64, 1, 1)] void main(uint3 i : SV_DispatchThreadID) { uint numStructs, stride; SourcePoints.GetDimensions(numStructs, stride); if (i.x numStructs) return; Point p SourcePoints[i.x]; if (IsSeparator(p)) // 分隔点直接透传 { ResultPoints[i.x] p; return; } float3 pos p.Position; float4 f GetField(float4(pos, 0)); // 求场值距离在 .w if (WriteTo 1) p.FX1 f.w; // 写 F1 通道 else if (WriteTo 2) p.FX2 f.w; // 写 F2 通道 ResultPoints[i.x] p; }从中可以确认三个实现细节调度粒度每个线程组 64 个线程每个点一个线程按SourcePoints.GetDimensions得到的数量做越界保护场值约定GetField返回float4其中w 分量是距离值GetDistance函数即取.w——这与 SDF 场的数据约定一致特殊点透传IsSeparator(p)判断的分隔点原样拷贝不会参与采样与写回写回通道FX1/FX2是Point结构内置的附加标量字段相关结构与辅助函数来自shared/point.hlsl通过WriteTo参数在 None/F1/F2 之间选择None模式下只求值不写回。五、三个算子的典型协作工作流在实际 TiXL 项目中这三个算子常组合成完整的场驱动链路Lib.field.generate.sdf 系列生成 SDF │ ├──► RaymarchField渲染为 3D 表面参与深度混合 │ └──► SampleFieldPoints ◄── 粒子点集 │ └──► 粒子按距离改变行为FX1/FX2 驱动下游算子 Lib.field.generate 2D 场 ──► Render2dField ──► 纹理输出RaymarchField负责让 SDF 可见、可合成到 3D 场景Render2dField负责把 2D 颜色场变成纹理SampleFieldPoints则把场的信息反向注入粒子数据FX1/FX2实现场驱动粒子的交互效果。三者共同的MaxSteps / StepSize / MinDistance / MaxDistance参数族说明它们共享同一套步进求值的底层思路理解一个算子的调参逻辑即可举一反三。六、相关资源速查算子文档.help/docs/operators/lib/field/render/下的 RaymarchField.md、Render2dField.md、SampleFieldPoints.md算子实现Operators/Lib/Symbols/field/render/RaymarchField.cs、Render2dField.cs、SampleFieldPoints.cs默认值与内部子图RaymarchField.t3采样计算着色器模板Operators/Lib/Assets/shaders/field/use/SampleFieldPointsTemplate.hlsl上游 SDF 生成器.help/docs/operators/lib/field/generate/sdf/目录下的 BoxSDF、SphereSDF、TorusSDF、FractalSDF 等算子文档可与本组渲染算子直接串联使用【免费下载链接】t3TiXL is an open source software to create realtime motion graphics.项目地址: https://gitcode.com/GitHub_Trending/t3/t3创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考