TiXL 网格顶点选择算子 SelectVertices 完全指南基于体积场的选择与后续变换管线【免费下载链接】t3TiXL is an open source software to create realtime motion graphics.项目地址: https://gitcode.com/GitHub_Trending/t3/t3导读SelectVertices是 TiXL 开源实时动态图形软件Lib.mesh.modify 算子库中用于设置网格顶点 Selection 属性的核心算子它通过一个可自由变换的体积场球体、立方体、平面、条纹、噪声等为每个顶点计算 01 的选择权重从而为后续 DisplaceMesh、变形、着色等操作提供作用于局部顶点集合的能力。读完本文你将掌握 SelectVertices 的全部输入参数语义、五种体积形状与五种混合模式的底层数学实现、其在网格修改管线中的典型接入方式以及它与 PbrVertex 顶点结构的内在关联。算子概览它解决什么问题在 TiXL 的网格修改管线中很多算子如 DisplaceMesh、ScatterMeshFaces需要只影响网格的一部分顶点。SelectVertices 正是为这一需求提供统一入口的算子Sets the selection property of mesh vertices from a volume. This can later be used to selectively apply manipulations like displace.它根据顶点在体积场中的位置把Selection值写入每个顶点下游算子可读取该值决定施加作用的强度与范围。文档将其归类于Lib.mesh.modify目录索引并关联到同类算子 ScatterMeshFaces。从源码结构看该算子的宿主定义位于 SelectVertices.cs其计算核心是 GPU 计算着色器 mesh-SelectVertices.hlsl算子本身通过.t3图定义SelectVertices.t3装配了 ComputeShader、Transform、Buffer 拆分/组装等子节点。输入参数详解原文档给出了 12 个输入参数下表完整保留并补充了类型、默认值与取值说明名称类型默认值说明InputMeshMeshBuffers必填null输入网格缓冲区提供顶点位置与原始 SelectionVolumeShapeInt320体积形状映射枚举0Sphere1Box2Plane3Zebra4NoiseCenterVector3(0,0,0)体积场中心世界/对象空间位置StretchVector3(1,1,1)体积场各轴拉伸比例ScaleSingle1.0体积整体缩放系数RotateVector3(0,0,0)体积场旋转欧拉角FallOffSingle1.0边界过渡宽度控制选择区边缘的渐变软硬ModeInt320混合模式枚举0Override1Add2Sub3Multiply4InvertClampResultBooleantrue是否把结果钳制到 [0,1]关闭时允许超出范围的值StrengthSingle1.0作用强度在各模式下缩放贡献量PhaseSingle0.0相位偏移用于平移/动画化 Zebra 条纹、Noise 采样或 Box 距离ThresholdSingle0.0阈值用于 Zebra 条纹宽度与 Noise 噪声切分以上默认值均来自 SelectVertices.t3 中的DefaultValue字段可作为在编辑器中新建算子时的参考基线。体积形状VolumeShape的数学实现计算着色器中通过阈值常量区分五种形状见 mesh-SelectVertices.hlslstatic const float VolumeSphere 0.5; static const float VolumeBox 1.5; static const float VolumePlane 2.5; static const float VolumeZebra 3.5; static const float VolumeNoise 4.5;每个顶点先由对象空间坐标经TransformVolume矩阵变换到体积场空间mul(float4(posInObject, 1), TransformVolume).xyz矩阵由 Center / Rotate / Scale / Stretch 组合并求逆而来随后按形状计算距离d再统一用smoothstep映射为选择权重Sphere球体float distance length(posInVolume); s smoothstep(1 FallOff, 1, distance);以原点为中心的单位球半径 1。distance小于 1 时s趋向 1完全选中在1到1FallOff之间线性过渡到 0。FallOff 越大边缘渐变越宽越柔和。Box立方体float3 t abs(posInVolume); float distance max(max(t.x, t.y), t.z) Phase; s smoothstep(1 FallOff, 1, distance);以切比雪夫距离无穷范数度量得到各轴向棱长 2 的单位立方体。注意Phase在此处直接叠加到距离上可整体平移选择边界。Plane平面float distance posInVolume.y; s smoothstep(FallOff, 0, distance);仅依据 Y 轴坐标选中 Y ≤ 0 的半空间。过渡带宽度由 FallOff 单独控制从FallOff渐变到0。Zebra条纹float distance 1 - abs(mod(posInVolume.y * 1 Phase, 2) - 1); s smoothstep(Threshold 0.5 FallOff, Threshold 0.5, distance);在 Y 轴上生成周期为 2 的三角波条纹。Phase沿 Y 方向平移条纹Threshold改变条纹的占空比宽度比例FallOff 控制条纹边缘的软硬。Noise噪声场float3 noiseLookup (posInVolume * 0.91 Phase); float noise snoise(noiseLookup); s smoothstep(Threshold FallOff, Threshold, noise);在体积空间中以 0.91 的频率倍率采样 Simplex 噪声snoise来自shared/noise-functions.hlslPhase可平移采样坐标实现流动动画Threshold决定噪声值在哪个水平被选中适合生成有机、不规则的选中区域。混合模式Mode与 Strength 的作用五种模式的实现同样直接体现在着色器中static const float ModeOverride 0.5; static const float ModeAdd 1.5; static const float ModeSub 2.5; static const float ModeMultiply 3.5; static const float ModeInvert 4.5;设s为形状计算得到的选择值src为顶点原始Selection模式公式语义Override0s * Strength直接覆盖用体积结果乘以强度Add1s src * Strength累加在已有选择上叠加Sub2s src - s * Strength减去从已有选择中扣除Multiply3s lerp(src, src * s, Strength)乘算按强度在保持不变与相乘之间插值Invert4s s * (1 - src)反相只对未选中区域生效计算完成后ResultVertices[i.x].Selected ClampResult 0.5 ? s : saturate(s);即ClampResult关闭时允许 Selection 超出 [0,1]下游算子可自行处理过冲开启默认时用saturate钳制到 [0,1]。Selection 属性与 PbrVertex 顶点结构SelectVertices 写入的 Selection 并非独立属性而是 PBR 顶点结构的内置字段。见 PbrVertex.cs[FieldOffset(16 * 4)] public float Selection; public const int Stride 20 * 4; // Total size: 20 floats - 80 bytesPbrVertex以 80 字节20 个 float紧凑布局依次为 Position、Normal、Tangent、Bitangent、Texcoord、Texcoord2、Selection、ColorRgb。这意味着 Selection 与颜色、法线等一样随顶点缓冲区传递任何基于结构化缓冲区的网格算子如 DisplaceMesh、自定义顶点着色器都能以极小成本读取它——这也是先 SelectVertices 选择、再 Displace 等算子应用这一管线能够高效串联的数据基础。与 SelectVerticesWithSDF 的区别原文档在 Lib.mesh.modify 目录中还列出了姊妹算子SelectVerticesWithSDF从 SelectVerticesWithSDF.cs 的接口定义可看出两者分工SelectVertices内置五种解析体积球/盒/平面/条纹/噪声参数少而直观适合常规范围选择SelectVerticesWithSDF接受SdfFieldShaderGraphNode输入配合 SDF有向距离场对象/场来选择和累加顶点值并提供MappingCentered/FromStart/PingPong/Repeat、Range、Offset、GainAndBias、Scatter、ClampNegative、DiscardNonSelected等更精细的控制用于复杂或程序化场的选择。两者共享相同的 Mode 枚举Override/Add/Sub/Multiply/Invert表明它们是同一选择机制在不同场来源下的两个入口。典型使用流程与实战建议一个常见的网格修改管线如下使用网格生成/导入算子得到InputMesh将SelectVertices接入配置 VolumeShape 与 Center/Scale/Stretch/Rotate 定位体积调整 FallOff 控制边缘渐变默认ModeOverride、Strength1.0、ClampResulttrue即可得到 0/1 二值化选择若要叠加多个选择区域将上一个 SelectVertices 的Result连入下一个的 InputMesh并把 Mode 设为 Add实现多体积求并集将最终 Result 连入 DisplaceMesh 等下游算子Selection 将决定形变强度分布。实战要点FallOff 控制软硬边缘FallOff0 得到锐利边界增大则产生平滑渐变是制作局部隆起/凹陷过渡区的关键参数用 Phase 驱动动画Zebra 与 Noise 模式下对 Phase 做时间动画Time节点驱动可得到条纹流动或噪声选区蠕动的动态效果Stretch 做非均匀体积例如把球体压扁成椭球用 Stretch(2,0.5,1) 即可得到不同轴长的选区ITransformable 支持从 SelectVertices.cs 可见算子实现了ITransformable将 Center/Rotate/Stretch 暴露为变换槽位可在视口内用 gizmo 直接拖动定位体积图定义中亦包含DrawBoxGizmo与VisibleGizmos子节点显著提升摆放效率性能着色器以[numthreads(64,1,1)]每顶点一线程并行执行对顶点数先做越界保护if (i.x numStructs) return;海量顶点下仍保持实时。源码路径速查算子宿主定义Operators/Lib/Symbols/mesh/modify/SelectVertices.csGPU 计算核心形状与模式数学Operators/Lib/Assets/shaders/3d/mesh/mesh-SelectVertices.hlsl算子图定义与默认值Operators/Lib/Symbols/mesh/modify/SelectVertices.t3顶点 Selection 字段Core/Rendering/PbrVertex.csSDF 变体Operators/Lib/Symbols/mesh/modify/SelectVerticesWithSDF.cs 与 SelectVerticesWithField.hlsl算子库索引.help/docs/operators/lib/mesh/modify/README.md【免费下载链接】t3TiXL is an open source software to create realtime motion graphics.项目地址: https://gitcode.com/GitHub_Trending/t3/t3创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考