ARTICLE DETAIL

资讯详情

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

TiXL 网格克隆与实例化实战:RepeatMeshAtPoints 与 DrawMeshAtPoints 的取舍、形变顺序与材质工作流

TiXL 网格克隆与实例化实战:RepeatMeshAtPoints 与 DrawMeshAtPoints 的取舍、形变顺序与材质工作流 TiXL 网格克隆与实例化实战RepeatMeshAtPoints 与 DrawMeshAtPoints 的取舍、形变顺序与材质工作流【免费下载链接】t3TiXL is an open source software to create realtime motion graphics.项目地址: https://gitcode.com/GitHub_Trending/t3/t3本文基于 TiXLTooll 3官方视频教程 Tip#017《Cloning vs. Instancing Meshes》来源.help/references/video-analysis/LjmnVL7azYw.md展开结合仓库内算子的真实源码与着色器实现完整讲解在散点位置批量复制网格的两种技术路线用 RepeatMeshAtPoints 把副本烘焙成单个大网格克隆以及用 DrawMeshAtPoints 在每个点反复绘制同一份小网格实例化。读完你将掌握两者的内存/性能/可编辑性差异、形变类算子DisplaceMesh与两者的接线顺序陷阱、UV 重投影与渐变材质、透明切片等完整的实战配方。一、两种思路把一个小网格变成一片网格在实时图形VJ、动态影像、舞台视觉场景中最常见的需求之一是把一个基础网格例如一个立方体、一朵花或一段文字模型复制到成百上千个散点位置上形成阵列、点云或重复图案。TiXL 提供了两条截然不同的技术路线视频教程 0:241:24 部分对它们做了直接对比克隆Cloning使用 RepeatMeshAtPoints把源网格的顶点与三角形烘焙进每一个散点位置最终产出一个合并后的、包含全部新增顶点和面的单一网格。代价是 buffer 更重但结果是真实的几何体之后可以继续被任意修改类算子编辑。实例化Instancing使用 DrawMeshAtPoints不产生新几何而是在渲染时对同一份小网格按每个点重复绘制。GPU 内存占用明显更低因为它不需要上传一份被乘以点数量的巨大 buffer。一句话概括视频的核心结论想要真几何可继续形变、投影、切片就克隆想要省内存、轻量重复就实例化。下面两节分别深入两种算子的实现。二、克隆路线RepeatMeshAtPoints 的烘焙原理2.1 算子接口与默认值从 RepeatMeshAtPoints.cs 可以看到该算子的输入输出端口类型说明PointsBufferWithViews散点缓冲位置、旋转、缩放、颜色、FX1/FX2InputMeshMeshBuffers被复制的源网格Scalefloat全局缩放默认 1.0ScaleFactorenumNone/F1/F2是否用点的 FX1 或 FX2 通道乘缩放默认 NoneApplyPointScalebool是否应用每个点的自身 Scale默认 trueStretchVector3三轴拉伸默认 (1,1,1)TexCoord2FactorenumNone/F1/F2是否用 FX1/FX2 乘 TexCoord2常用于错开 VAT 顶点动画相位默认 NoneResult输出MeshBuffers合并后的克隆网格2.2 底层两个 Compute Shader 的两次烘焙RepeatMeshAtPoints.t3 揭示了它的内部结构它不是一个 C# 里手写的算法而是由两个ComputeShader子算子组成的图形化流程分别引用mesh-RepeatVerticesAtPoints.hlsl负责把源顶点复制并变换到每个点mesh-RepeatIndicesAtPoints.hlsl负责把三角形索引复制并偏移。顶点复制着色器的核心逻辑简化后是二维派发[numthreads(16,16,1)]用线程 ID 的x当顶点号、y当点号目标顶点索引为pointIndex * sourceVertexCount vertexIndex。它对每个副本依次做// 逐点应用旋转四元数构建朝向矩阵 float4x4 orientationMatrix transpose(qToMatrix(p.Rotation)); // 缩放链ApplyScale 决定是否用点的 ScaleScaleFX 决定是否乘 FX1/FX2 float sizeFxFactor ScaleFX 0 ? 1 : (ScaleFX 1) ? p.FX1 : p.FX2; float3 resizeFromScale ApplyScale ? p.Scale : 1; posInObject.xyz * max(0, resizeFromScale) * Stretch * Size * sizeFxFactor; // 旋转 → 平移到点位置 posInObject mul(float4(posInObject.xyz, 1), orientationMatrix); posInObject float4(p.Position, 0); // 法线/切线/副切线随旋转更新颜色乘点的颜色 v.Normal qRotateVec3(v.Normal, p.Rotation); v.Tangent qRotateVec3(v.Tangent, p.Rotation); v.Bitangent qRotateVec3(v.Bitangent, p.Rotation); v.ColorRGB * p.Color.rgb;索引复制着色器则更简单ResultFaces[pointIndex * sourceFaceCount faceIndex] SourceFaces[faceIndex] VertexCount * pointIndex;——每个点的三角形索引整体偏移VertexCount把各点副本的面指向各自复制出的顶点区间。可见克隆本质上是在 GPU 上做了一次彻底的顶点与索引展开这正是真正的几何体这一特性的来源每个副本的顶点都是独立的、可被后续算子寻址的。三、实例化路线DrawMeshAtPoints 的重复绘制3.1 算子接口与默认值DrawMeshAtPoints.cs 的输入输出如下输出是一个SlotCommand即它属于绘制命令类算子要接在渲染管线里端口类型默认值说明GPointsBufferWithViews–散点缓冲MeshMeshBuffers–被重复绘制的源网格Sizefloat1.0全局缩放ScaleFactorenumNone/F1/F2None用点的 FX1/FX2 乘缩放UsePointScalebooltrue是否使用点的 ScaleColorVector4(1,1,1,1)整体颜色乘到点颜色上AlphaCutOfffloat0.0alpha 裁剪阈值0 时启用BlendModeenum0混合模式FillModeenum3填充模式如线框/实体CullModeCullModeBack背面剔除ShadingenumDefault/FlatDefault是否使用扁平着色SpecularAAfloat0.5高光抗锯齿EnableZWrite/EnableZTestbooltrue / true深度写入与测试ColorFieldShaderGraphNode–连接自定义着色器图AtlasSizeInt2(1,1)纹理图集列×行数AtlasModeenumBufferOrder/F1/F2BufferOrder图集选格方式Output输出Command–绘制命令注意一个实现细节Output端口声明了DirtyFlagTrigger DirtyFlagTrigger.Always意味着它每一帧都被标记为需要重绘——这与视频中当每个点的计数被动画化时成本才开始显现的说法完全对应实例化天然支持逐帧变化的点数量因为它不依赖静态展开的缓冲。3.2 底层一个顶点着色器完成按实例变换DrawMeshAtPoints.t3 中顶点着色器使用 mesh-DrawAtPoints.hlsl 模板经GenerateShaderGraphCode注入字段代码入口为vsMain。它的核心技巧是从SV_VertexID反解出属于哪个点、哪个三角形int verticesPerInstance faceCount * 3; int faceIndex (id % verticesPerInstance) / 3; // 当前三角形 int faceVertexIndex id % 3; // 三角形内第几个顶点 int instanceIndex id / verticesPerInstance; // 当前实例点 PbrVertex vertex PbrVertices[FaceIndices[faceIndex][faceVertexIndex]]; float3 s Scale * sizeFactor * (UsePointScale ? Points[instanceIndex].Scale : 1); posInObject.xyz * s; posInObject mul(float4(posInObject.xyz, 1), orientationMatrix); posInObject float4(Points[instanceIndex].Position, 0);这与克隆着色器几乎相同的变换公式但发生位置完全不同克隆在计算阶段把结果写入新 buffer实例化在顶点着色阶段即时计算GPU 从头到尾只保留一份源网格缓冲。像素着色器psMain走完整的 PBR 流程albedo、法线、Roughness/Specular/Metal、雾、字段 Field并支持Flat ShadingShading选 Flat 时用ddx/ddy求几何法线再做切线空间法线贴图叠加Alpha 裁剪AlphaCutOff 0 litColor.a AlphaCutOff时discard即视频 3:34 提到的透明裁剪切片在源码中的落点图集选格AtlasSize大于 1 时按BufferOrder实例序号取模或FX1/FX2AtlasModeF1/F2计算textureCelX/Y把 UV 缩放进对应图集格子——这正是每个点可以各取一张贴图格的机制。四、两者核心权衡一览维度RepeatMeshAtPoints克隆DrawMeshAtPoints实例化结果类型MeshBuffers 真几何可继续进修改管线Command 绘制命令直接出画面GPU 内存高顶点/索引按点数展开一次上传大 buffer低只上传一份源网格逐点重绘点数量动画化点变化需重新烘焙天然支持输出始终标记 Dirty后续可编辑性可被 DisplaceMesh、MeshProjectUV 等继续处理上游形变才有效下游无法修改已绘内容适用场景需要连续形变、UV 重投影、材质条纹的造型海量轻量重复、追求省显存的粒子式效果五、关键陷阱形变必须发生在克隆之后、实例化之前视频 2:012:43 专门用一段 Gotcha 强调了最容易踩的坑——DisplaceMesh 与两种方案的位置关系完全不同把 DisplaceMesh 接在RepeatMeshAtPoints 之后由于克隆结果是真实顶点位移会把整个合并后的表面当作一个连续的整体来扭曲——例如一片克隆出的平面阵列会在一次位移中变成连绵起伏的地形。这是克隆独有的能力。把 DisplaceMesh 接在DrawMeshAtPoints 之后没有任何效果因为实例化输出的是绘制命令不是可修改的网格数据把 DisplaceMesh 接在DrawMeshAtPoints 的源网格上虽然每个点都会变形但每个点重复的是完全相同的扭曲——它不会形成整体连续形态而是 N 份相同的局部变形。从 DisplaceMesh.cs 的接口看它提供ModeSurface / Surface_XYZ / World_XYZ、Amount、AmountDistribution、Offset、Texture高度图、UvSelectionTexCoord / TexCoord2、WrapModeWrap/Mirror/Clamp/Border/MirrorOnce、ScaleUV与UseVertexSelection是一个典型的基于 UV 采样驱动顶点偏移的修改算子因此它必然要求输入是可写的顶点缓冲——这从数据流上解释了为何它只能作用于克隆产物。六、完整实战配方从散点网格到带条纹的连续造型综合视频 0:243:56 的演示一个完整的克隆 → 形变 → 材质工作流如下算子按顺序接线生成散点用GridPoints/RadialPoints/SpherePoints等点生成算子见 Operators/Lib/Symbols/point/generate 下的 t3ui 定义作为Points输入克隆RepeatMeshAtPoints把源网格烘焙到每个点ApplyPointScale开启时每个点按自身 Scale 缩放得到真实几何连续形变DisplaceMesh接在其后Mode按需求选 Surface 或 World_XYZ整片表面被当作连续体扭曲重投影 UV在 MeshProjectUV.cs 中把投影平面Translate/Rotate/Stretch/Scale对准新表面重新生成 UV它实现了ITransformable接口可在视口中直接操作投影变换勾选ToTexCoord2时把投影结果写入第二套 UVTexCoord2方便后续按不同 UV 采样材质条纹SetMaterial接上LinearGradient作为默认材质克隆出的真实网格携带 UV渐变会在合并几何上呈现为一条条横贯整体的色带视频 3:143:34 的演示透明切片在材质上把透明度拉满并配合AlphaCutOffDrawMeshAtPoints 的AlphaCutOff或材质的 alpha 裁剪即可切开实心造型观察内部截面——视频提醒这是高开销但快速见效的手法。仓库中还附带可直接打开的示例 DrawMeshAtPointsExample.t3对应 DrawMeshAtPointsExample.cs以及大量应用了此类点阵复制的用户工程如Operators/examples/Symbols/user/pixtur/vj/scenes/VJRepetitionTunnel.t3、MarsFractalRepeat.t3可作为观察真实用法的参考。七、选型速查要做可继续编辑的连续表面地形、织物、被整体扭曲的图案→ 选 RepeatMeshAtPoints后续接 DisplaceMesh / MeshProjectUV / SetMaterial要做海量、轻量、逐帧变化的重复粒子群、星空、草丛且对显存敏感 → 选 DrawMeshAtPoints形变类算子一律放在其上游源网格处需要每点不同的贴图 → 实例化路线用AtlasSizeAtlasModeBufferOrder/F1/F2克隆路线用TexCoord2Factor错开第二套 UV 的动画相位。理解克隆产出可修改的数据实例化只是重复绘制这一本质区别就能在 TiXL 中准确预判每个后续算子会生效还是失效避免在节点图上反复试错。【免费下载链接】t3TiXL is an open source software to create realtime motion graphics.项目地址: https://gitcode.com/GitHub_Trending/t3/t3创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表