TiXL SampleFieldPoints 操作符全解:在 GPU 上对 Field(SDF 场)逐点采样并写回粒子属性
TiXL SampleFieldPoints 操作符全解在 GPU 上对 FieldSDF 场逐点采样并写回粒子属性【免费下载链接】t3TiXL is an open source software to create realtime motion graphics.项目地址: https://gitcode.com/GitHub_Trending/t3/t3SampleFieldPoints 是 TiXL 开源实时图形软件中Lib.field.render分类下的核心计算操作符用于在 GPU 上对一个 Field着色器图 / SDF 距离场进行逐点采样并把采样得到的场值写回点数据Points的 FX1 或 FX2 通道。本文以仓库中的操作符声明、节点图定义与 HLSL 模板着色器为据完整讲解其输入输出参数、内部计算管线、底层实现原理及典型实战用法读完即可在 TiXL 中用它对粒子系统、点云执行按场变形 / 按场驱动的数据烘焙。操作符定位Lib.field.render 家族的一员在 Lib.field.render 操作符目录 中TiXL 将场Field的渲染与采样集中为三个操作符RaymarchField— 对连接的着色器图 SDF 进行光线步进渲染输出 DrawCommand 与 ShaderCode详见 RaymarchField 文档Render2dField— 把 2D 颜色场渲染进一张纹理SampleFieldPoints— 本文主角不对场做可视化渲染而是把场的数值采样到点缓冲中属于典型的数据端非渲染端操作。从职责上看前两者解决如何把场画出来而 SampleFieldPoints 解决如何把场的数值读出来喂给数据。它常与粒子系统、点云生成器配合先由field/generate一族的操作符如 SDF 组合、噪声场构造场再通过本操作符把场值烘焙进每个点的属性最终驱动粒子的半径、出生时间或自定义数据。操作符本体在仓库中的定义位于 SampleFieldPoints.cs其图形化节点图定义含全部子节点与连线位于 SampleFieldPoints.t3供在 TiXL 编辑器中打开查看。输入参数详解官方文档给出的输入参数表如下NameRelevancy Type说明PointsBufferWithViewsRequired待采样的点缓冲内部为T3.Core.DataTypes.BufferWithViews类型FieldShaderGraphNodeRequired要采样求值的场着色器图节点内部为T3.Core.DataTypes.ShaderGraphNode类型WriteToInt32控制采样结果写入点的哪个属性通道Points被采样的点集这是执行采样的遍历对象携带一组结构化点数据。从 C# 声明可见其精确类型为InputSlotT3.Core.DataTypes.BufferWithViewsSampleFieldPoints.cs即带视图Views的缓冲可被 GPU 计算着色器以结构化缓冲StructuredBuffer方式读取。点数据的内存布局由 point.hlsl 定义struct Point { float3 Position; // 位置 float FX1; // 通用数据通道 1对粒子而言即 Radius float4 Rotation; // 旋转四元数 float4 Color; // 颜色 float3 Scale; // 缩放对粒子而言即 Velocity float FX2; // 通用数据通道 2对粒子而言即 BirthTime };注意该头文件开头的注释明确了点与粒子共用同一结构、同一 stride只是某些属性的语义不同粒子视角下FX1即Radius半径、Scale即Velocity速度、FX2即BirthTime出生时间通用点数据视角下FX1/FX2是两个自由的 float 通道正好是 SampleFieldPoints 写入的目标。Field被采样求值的场类型为InputSlotT3.Core.DataTypes.ShaderGraphNodeSampleFieldPoints.cs。场本身不是一段固定数据而是一棵着色器图Shader Graph——由field/generate相关操作符构造、最终会被编译进计算着色器的函数集合。SampleFieldPoints 通过模板着色器中的/*{FIELD_CALL}*/占位符把用户连接的场函数注入进采样代码详见下文原理小节。WriteTo写入通道选择类型为InputSlotint并在声明处映射到枚举FModesSampleFieldPoints.csprivate enum FModes { None, // 0不写入 F1, // 1写入点的 FX1 通道粒子为 Radius F2, // 2写入点的 FX2 通道粒子为 BirthTime }从 SampleFieldPoints.t3 的默认值定义可知WriteTo 的默认值为 1F1即默认把采样结果写入 FX1。模板着色器中的分支逻辑与此一一对应if (WriteTo 1) { p.FX1 f.w; } else if (WriteTo 2) { p.FX2 f.w; }值得留意的是同一 C# 文件中还声明了ShapesSphere/Box/Plane/Zebra/Noise与ModesOverride/Add/Sub/Multiply/Invert两组枚举SampleFieldPoints.cs从源码结构看它们可能是后续扩展例如字段形状或写入混合模式预留的接口但在当前版本中并未暴露为输入参数也未在模板中被引用。输出Result2NameTypeResult2T3.Core.DataTypes.BufferWithViews输出是被采样/写入后的点缓冲点数量、布局与输入完全一致仅每个点的 FX1 或 FX2 通道被更新取决于 WriteTo。它可以直接连回粒子系统、点渲染操作符或继续接入其他数据操作符。从节点图连线看SampleFieldPoints.t3ExecuteBufferUpdate的输出被连接到操作符对外暴露的Result2槽确保每次计算后输出缓冲携带最新采样结果。工作原理模板着色器逐行解析SampleFieldPoints 的核心计算逻辑不是写在 C# 里而是通过模板着色器 SampleFieldPointsTemplate.hlsl 在运行时生成。下面按关键段落解析。引用与参数缓冲#include shared/hash-functions.hlsl #include shared/point.hlsl #include shared/quat-functions.hlsl #include shared/bias-functions.hlsl cbuffer Params : register(b0) { } cbuffer Params : register(b1) { /*{FLOAT_PARAMS}*/ } cbuffer Params : register(b2) { int WriteTo; }模板默认引入了哈希函数hash-functions.hlsl、点结构、四元数函数quat-functions.hlsl与偏置函数bias-functions.hlsl后续字段生成或额外资源通过/*{ADDITIONAL_INCLUDES}*/、/*{GLOBALS}*/、/*{FIELD_FUNCTIONS}*/、/*{RESOURCES(t1)}*/等占位符注入。WriteTo以独立 cbufferb2传给着色器。场求值入口float4 GetField(float4 p) { float4 f 1; /*{FIELD_CALL}*/ return f; } inline float GetDistance(float3 p3) { return GetField(float4(p3.xyz, 0)).w; }/*{FIELD_CALL}*/是生成器注入用户场调用的位置——连接的着色器图代码会在此处被展开。场返回float4其中.w通道被视为距离/标量值正是 SampleFieldPoints 采样并写入点的内容f.w。这与 RaymarchField 对 SDF 的距离场约定一致因此同一个 Field 既可用于渲染也可用于采样。计算主函数[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)); if (WriteTo 1) p.FX1 f.w; else if (WriteTo 2) p.FX2 f.w; ResultPoints[i.x] p; }执行模型是一对一的点遍历计算线程映射每个 GPU 线程处理一个点线程组大小为 64[numthreads(64,1,1)]与节点图中ComputeShaderStage的 Dispatch 参数64×1×1见 SampleFieldPoints.t3一致越界保护通过SourcePoints.GetDimensions(numStructs, stride)取缓冲实际元素数i.x numStructs直接返回分离点透传若点满足IsSeparator(p)Scale.x为 NaN原样复制后返回。这是 point.hlsl 中约定的 NaN 约定分离点永不被绘制并且会打断线条类line/tube/ribbon绘制的条带。SampleFieldPoints 特意保留这些点不参与采样从而保证线序和条带结构不被破坏采样与写入以点位置p.Position为参数调用GetField取.w写入FX1或FX2最后写回ResultPoints[i.x]。内部节点图一次完整的生成-编译-派发流水线从 SampleFieldPoints.t3 的Children与Connections可以看到该操作符内部是一张自包含的微图核心环节包括子节点作用依据连线与输入推断ReadFile读取模板路径Lib:shaders/field/use/SampleFieldPointsTemplate.hlslGenerateShaderGraphCode接收外部Field输入把着色器图代码生成并注入模板/*{FIELD_CALL}*/等占位符ComputeShaderFromSource以注入后的完整源码编译计算着色器DebugName 为sampleFieldPointGetBufferComponents×2分别解析输入 Points 缓冲的组件与输出缓冲的组件StructuredBufferWithViews以Stride 64字节构造输出结构化缓冲与Point结构尺寸对应CalcDispatchCount依据缓冲元素数与 64 线程/组计算 Dispatch 数量ComputeShaderStage以Dispatch(64,1,1)派发计算着色器ExecuteBufferUpdate执行缓冲更新其输出即操作符的Result2IntsToBuffer/FloatsToBuffer把WriteTo等标量参数打包进常量缓冲这条链路的顺序即读模板 → 注入场代码 → 编译 → 解析缓冲 → 计算派发数 → 派发 GPU 线程 → 写回输出缓冲。对外表现为输入点 输入场 → 输出更新后的点内部则完全在 GPU 上完成不产生 CPU 回读。实战用法与示例仓库 Operators/examples/Symbols/lib/field/generate/ 下提供了场相关示例如 Image2dSDFExample.t3其内部同时使用OrbitCamera与RaymarchField渲染 SDF 场景。基于此可以勾勒出 SampleFieldPoints 的典型接入套路构造场用field/generate一族的操作符SDF 组合、噪声场等生成 Field连接到本操作符的Field输入准备点集由粒子生成器或点云操作符产出点缓冲BufferWithViews连接到Points输入选择写入通道将WriteTo设为F1写 FX1/Radius或F2写 FX2/BirthTime默认F1消费结果把Result2连到粒子系统或点渲染器。例如在一个 SDF 距离场球体、盒体或分形噪声场中场值 点到表面的距离。把该值写入粒子的 FX1半径后粒子会随场梯度呈现大小变化形成被场雕刻的效果写入 FX2出生时间则能让粒子按场值错峰出生用于场驱动的时序动画。若要按距离把场值变成视觉位移可在下游把 FX1 值映射为粒子 Scale 或 Color。配置要点Points 与 Result2 元素一一对应采样是纯遍历数量与顺序均不改变只有通道值变化因此可以放心在管线中原地替换WriteTo 与粒子语义联动由于FX1→Radius、FX2→BirthTime的映射point.hlsl选择写入通道等于选择驱动粒子的哪个属性对非粒子点云则视为自由 float 通道分离点安全含 NaN Scale.x 的分离点被透传线条类渲染的条带结构不会被采样破坏因此可直接用于带断点/分段绘制的线系统性能逐点并行线程组 64无需 CPU 回读适合每帧对数十万点做实时采样具体性能取决于场函数的复杂度与点数量建议结合实际场景验证。小结SampleFieldPoints 用最简洁的接口两个必填输入 一个通道选择输入 一个输出把场与点数据在 GPU 上桥接起来它以模板着色器 运行时代码注入的方式复用同一个 Field把场值烘焙进点的 FX1/FX2 通道同时优雅地处理了越界与分离点边界情况。理解它的关键在于三处点的内存布局point.hlsl、场值约定GetField(...).w、以及读模板 → 注入 → 编译 → 派发的内部节点图流水线。掌握它之后TiXL 中用数学场实时驱动百万粒子的数据链路即可轻松打通。【免费下载链接】t3TiXL is an open source software to create realtime motion graphics.项目地址: https://gitcode.com/GitHub_Trending/t3/t3创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

ESP32+MAX30102零基础实现心率检测实战指南

ESP32+MAX30102零基础实现心率检测实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/19 7:09:11 阅读更多 →
Java时区处理:痛点解析与专业解决方案

Java时区处理:痛点解析与专业解决方案

1. 时区处理的痛点与解决方案在Java开发中,处理时区问题就像在雷区跳舞——稍有不慎就会引发各种诡异的时间显示错误。我见过太多项目因为时区处理不当导致跨时区会议系统显示错误时间、国际电商平台订单时间混乱、全球日志系统时间戳无法对齐等问题。Java标准库虽然…

2026/9/19 7:09:11 阅读更多 →
达梦数据库定时数据迁移:存储过程与DBMS_SCHEDULER实战

达梦数据库定时数据迁移:存储过程与DBMS_SCHEDULER实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/21 3:26:25 阅读更多 →

最新新闻

commitlint 规则配置完全指南:Level、Applicable 与 Value 的三种写法及内置规则全参考

commitlint 规则配置完全指南:Level、Applicable 与 Value 的三种写法及内置规则全参考

commitlint 规则配置完全指南:Level、Applicable 与 Value 的三种写法及内置规则全参考 【免费下载链接】commitlint 📓 Lint commit messages 项目地址: https://gitcode.com/gh_mirrors/co/commitlint commitlint 通过「规则(Rules&…

2026/9/21 15:52:59 阅读更多 →
Vue Router 命名视图(Named Views)实战指南:多出口布局与嵌套命名视图

Vue Router 命名视图(Named Views)实战指南:多出口布局与嵌套命名视图

前端路由 【免费下载链接】vue-router 🚦 The official router for Vue 2 项目地址: https://gitcode.com/gh_mirrors/vu/vue-router 点击查看 免费下载 命名视图(Named Views)是 Vue Router(Vue 2 官方路由&#xff…

2026/9/21 15:52:59 阅读更多 →
CodeIgniter 3.0.2 升级至 3.0.3 实战指南:base_url 自动检测变更与 Host 头注入防护

CodeIgniter 3.0.2 升级至 3.0.3 实战指南:base_url 自动检测变更与 Host 头注入防护

CodeIgniter 3.0.2 升级至 3.0.3 实战指南:base_url 自动检测变更与 Host 头注入防护 【免费下载链接】CodeIgniter Open Source PHP Framework (originally from EllisLab) 项目地址: https://gitcode.com/gh_mirrors/co/CodeIgniter 本文面向正在使用 Code…

2026/9/21 15:51:58 阅读更多 →
使用 Native Image Gradle Plugin 集成 Reachability Metadata:从元数据仓库到 Tracing Agent 的完整实战指南

使用 Native Image Gradle Plugin 集成 Reachability Metadata:从元数据仓库到 Tracing Agent 的完整实战指南

使用 Native Image Gradle Plugin 集成 Reachability Metadata:从元数据仓库到 Tracing Agent 的完整实战指南 【免费下载链接】graal GraalVM compiles applications into native executables that start instantly, scale fast, and use fewer compute resources …

2026/9/21 15:51:58 阅读更多 →
FoundationDB Go 绑定(fdb-go)开发指南:安装、构建与事务编程实战

FoundationDB Go 绑定(fdb-go)开发指南:安装、构建与事务编程实战

FoundationDB Go 绑定(fdb-go)开发指南:安装、构建与事务编程实战 【免费下载链接】foundationdb FoundationDB - the open source, distributed, transactional key-value store 项目地址: https://gitcode.com/gh_mirrors/fo/foundationd…

2026/9/21 15:51:58 阅读更多 →
Moya 端点(Endpoint)深度指南:理解 Target 到 Endpoint 再到 URLRequest 的完整映射链路

Moya 端点(Endpoint)深度指南:理解 Target 到 Endpoint 再到 URLRequest 的完整映射链路

Moya 端点(Endpoint)深度指南:理解 Target 到 Endpoint 再到 URLRequest 的完整映射链路 【免费下载链接】Moya Network abstraction layer written in Swift. 项目地址: https://gitcode.com/gh_mirrors/mo/Moya Endpoint 是 Moya 中…

2026/9/21 15:51:58 阅读更多 →

日新闻

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程 【免费下载链接】agentic-awesome-skills AAS Core is the local, agent-first control plane for complete catalog discovery, agent-owned selection, stack validation, and …

2026/9/21 0:00:01 阅读更多 →
gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析 【免费下载链接】gin-vue-admin 🚀ViteVue3Gin拥有AI辅助的基础开发平台,企业级业务AI开发解决方案,内置mcp辅助服务,内置skills管理,…

2026/9/21 0:00:01 阅读更多 →
Wox 全功能插件开发实战指南:基于 Python / Node.js 宿主与 WebSocket 的持久化插件体系

Wox 全功能插件开发实战指南:基于 Python / Node.js 宿主与 WebSocket 的持久化插件体系

桌面应用AI 应用插件系统 【免费下载链接】Wox A cross-platform launcher that simply works 项目地址: https://gitcode.com/gh_mirrors/wo/Wox 点击查看 免费下载 全功能插件(Full-featured Plugin)是 Wox 三类插件实现方式中能力最完整的…

2026/9/21 0:00:01 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/21 3:13:20 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/21 2:19:36 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/21 4:51:05 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/21 15:36:51 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/21 15:36:51 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/19 23:35:34 阅读更多 →