TiXL LightRaysFx 算子深度解析God Rays 体积光效的算法原理、参数详解与实战调优【免费下载链接】t3TiXL is an open source software to create realtime motion graphics.项目地址: https://gitcode.com/GitHub_Trending/t3/t3LightRaysFx 是 TiXL 实时图形引擎开源项目用于创作实时动态图形内置图像效果库Lib.image.fx.stylize中的一款 2D 体积光God Rays / 上帝光效果算子底层基于社区作品 Simpler God Rays作者 akufishi改良而来。本文以该算子的官方文档 LightRaysFx.md 为骨架结合仓库中的 HLSL 着色器源码、算子 C# 包装类、.t3 配置定义与官方示例工程完整讲解其算法原理、全部输入输出参数、默认值与取值范围并给出可直接落地的实战接线与调参建议。读完本文你将能够在 TiXL 节点图中独立搭建、调试并动画化光晕/光线效果。LightRaysFx 是什么定位、来源与功能LightRaysFx 位于 TiXL 算子树Lib.image.fx.stylize分支下与其同族的算子还有 Glow、StarGlowStreaks、Steps、DetectEdges 等见 stylize 目录文档。它接收一张 2D 纹理作为输入输出一张同样尺寸的 2D 纹理在画面中沿指定方向产生光线从光源发散的体积光效果非常适合用于舞台 VJ、实时演出字幕、logo 出镜光晕等场景。从官方文档与算子描述LightRaysFx.t3ui可以看到它的血统Based on Simpler God Rays by akufishiPimped by Newemka即算法原型来自 Shadertoy 社区经典体积光作品 Simpler God Rays由 Newemka 在 TiXL 中重新实现并增强增加可选的 FX 扰动纹理、背景混合控制等能力。该算子在 TiXL 官方示例库中还有一个同名演示工程 LightRaysFxExample.t3可作为上手参照。核心原理多采样体积光射线算法源码级拆解LightRaysFx 的完整计算逻辑并不在 C# 层而在配套着色器 LightRayFx.hlsl 中。这份 HLSL 文件是理解该算子行为的关键其入口着色器由 LightRaysFx.t3 中的 PixelShader 节点以Source Lib:shaders/img/fx/LightRayFx.hlsl、EntryPoint psMain方式引用。参数常量缓冲着色器顶部定义了一个常量缓冲constant buffer与算子输入一一对应cbuffer ParamConstants : register(b0) { float2 Center; // 光线发散中心由 Direction 输入换算而来 float NumSamples; // 采样步数对应 Samples 输入 float Length; // 光线长度 float4 RayColor; // 光线颜色 float Decay; // 衰减 float ApplyFxToBackground; // FX 纹理对背景的混合强度 float Amount; // 光线强度 float RefineFactor; // 精化 pass 专用当前未启用 float RefineSamples;// 精化 pass 专用当前未启用 float AspectRatio; // 宽高比修正 }psMain体积光采样主循环主着色器psMain的算法是典型的沿径向多步采样累加式体积光实现float4 psMain(vsOutput input) : SV_TARGET { // 1. 将 -1..1 的 Direction 输入换算为 0..1 纹理坐标系的中心点 float2 centerproof Center * float2(1, -1) float2(0.5, 0.5); float2 uv input.texCoord; // 2. 原始颜色背景与 FX 纹理按 ApplyFxToBackground 混合 float4 orgColor Image.Sample(texSampler, uv) * lerp(1, FxImage.Sample(texSampler, uv), ApplyFxToBackground); // 3. 计算每步采样偏移量从当前像素指向中心的距离 * Length / 采样数 float2 delta (uv - centerproof) * Length / NumSamples; float4 colorSum 0; // 4. 沿朝向中心的方向逐像素往回采样并累加权重随距离按 Decay 衰减 for (int i 1; i NumSamples; i) { uv - delta; colorSum Image.Sample(texSampler, uv) * FxImage.Sample(texSampler, uv) * pow(1 - (float)i / NumSamples, Decay); } // 5. 合成原始颜色 采样累加值再乘光线颜色与强度并做上溢出保护 return clamp(orgColor colorSum / NumSamples * RayColor * Amount, 0, float4(1000, 1000, 1000, 1)); }这段代码可以用三句话概括其效果原理光线方向delta (uv - centerproof) * Length / NumSamples决定了每帧每个像素沿指向光源中心的射线方向步进因此Direction参数实际上控制的是光源中心在画面中的位置配合宽高比修正方向为负值时会产生方向翻转。光强来源步进过程中累加的是Image.Sample * FxImage.Sample即输入图像自身在沿途各点的亮度/颜色因此画面中越亮的区域越容易拉出光线Decay通过pow(1 - i/NumSamples, Decay)控制远端采样权重衰减的快慢。最终合成原始画面被保留并与累加结果相加RayColorRGBA与Amount共同决定光线色彩与强度最后clamp到 1000 上限避免 HDR 溢出。Pass2Refine一次被放弃的精化尝试着色器末尾还有一个Pass2Refine入口它尝试根据像素与光源中心的距离动态扩大步长实现近处更精细、远处更稀疏的精化采样。但在 LightRaysFx.t3ui 的 Section 说明中明确记录了这一尝试的结果An ill-fated attempt to implement a second refinement pass. The even distance scaling in the first pass sadly caused visual artifacts, there were not obvious how to resolve.即该精化 pass 因产生难以解决的视觉伪影而未被启用。这也是为什么 LightRaysFx.t3 虽然创建了使用Pass2Refine入口的 PixelShader 节点但实际渲染链路的主输出仍由psMain承担。这个细节提示使用者当前版本的效果质量由psMain的多步采样质量决定提高Samples是提升光线平滑度的最直接手段。输入参数详解官方文档以表格形式列出了全部输入参数。下表完整继承原文档信息并补充了从 LightRaysFx.t3默认值与 LightRaysFx.t3uiUI 范围中确认的默认值与取值建议参数名类型相关性默认值UI 范围作用说明ImageTexture2D必需Requirednull—输入画面也是光线的颜色/亮度来源。无输入时效果无法产生TextureFXTexture2D相关Relevantnull—用于为光线引入更多变化的辅助纹理以multiply乘法混合方式参与采样可叠加噪点、渐变等制造不规则光斑DirectionVector2—(0.0, 0.0)-2.0 ~ 2.0Vec2 位置控制决定光源中心在画面中的位置-1..1 范围最终换算到 0..1 纹理坐标进而决定光线的发散方向与强度分布SamplesInt32—100—每像素沿射线方向的采样步数。越大光线越平滑、拖尾越细腻但 GPU 开销线性上升LengthSingle—0.4—光线拖尾总长度与采样数共同决定每步步长。示例工程中常用 0.85 ~ 0.94RayColorVector4—(1, 1, 1, 1)0.0 ~ 1.0各分量 Clamp光线颜色RGBA。默认白色可调成暖黄、青色等主题色DecaySingle—0.9—沿射线方向的亮度衰减幂指数控制远端光线的淡出速度ApplyFXToBackgroundSingle—1.0—FX 纹理对原始背景的混合程度0~10 表示 FX 只作用于光线1 表示背景也叠加 FX 纹理AmountSingle—5.0—光线的总体强度乘在累加结果上数值可大于 1 以获得更强烈的光晕几点由源码确认的调参要点Samples 与 Length 联动步长delta (uv - centerproof) * Length / NumSamples所以固定 Length 时增大 Samples 会让单步更小、光线更长且更连续固定 Samples 时增大 Length 会直接拉长光线。Decay 是幂指数pow(1 - i/NumSamples, Decay)中 Decay 越小远端衰减越慢、光线越长越亮Decay 接近 1 时光线迅速收敛。默认 0.9 属于较慢衰减、长拖尾的风格。RayColor 被 clamp 在 0~1见 LightRaysFx.t3ui 的 Min/Max/Clamp 标记但最终亮度上限是 1000因此可通过调大 Amount 获得 HDR 级强光效果。TextureFX 是乘法混合由于采样循环中Image.Sample * FxImage.SampleFX 纹理中为黑0的区域会掐断光线白色区域完全透光——这是制作缝隙光、云隙光等效果的关键技巧。输出输出名类型OutputT3.Core.DataTypes.Texture2DOutput 输出一张与输入 Image 相同尺寸的 RGBA 纹理内部中间缓冲使用R16G16B16A16_Float浮点格式以保留 HDR 精度见 LightRaysFx.t3 中 Texture2d 节点的 Format 设置可直接接入后续算子链或渲染到输出目标。底层实现从 .t3 配置看渲染管线C# 槽位定义算子本体由 LightRaysFx.cs 定义是一个继承InstanceLightRaysFx的密封类通过[Guid]属性与 .t3 配置文件中的 Id 关联。类中为每个输入声明了一个InputSlotT为输出声明了一个SlotTexture2D类型与文档表格完全一致[Input(Guid 9d4f4e29-b2fe-415b-90f1-18390b520346)] public readonly InputSlotTexture2D Image new InputSlotTexture2D(); [Input(Guid c661ae7d-1cac-482f-b200-2d47946c22db)] public readonly InputSlotint Samples new InputSlotint(); // ... 其余输入同理 [Output(Guid bdc413f2-9a15-4333-baba-aa57f73dda1a)] public readonly SlotTexture2D Output new();渲染链路与状态配置从 LightRaysFx.t3 的 Children/Connections 可以看到该算子的完整渲染子图它是由多个渲染基础算子拼装而成的宏算子VertexShader使用Lib:shaders/img/fx/Default2-vs.hlsl的vsMain配合两个Draw节点各 6 个顶点绘制全屏四边形PixelShader两套psMain/Pass2Refine入口均被实例化但主链路为psMain中间纹理两张R16G16B16A16_Float格式、ShaderResource RenderTarget绑定标志的 2D 纹理通过SrvFromTexture2d/RtvFromTexture2d完成采样与渲染目标切换SamplerStateAddressU/AddressV 为 Clamp、AddressW 为 Wrap、Filter 为 MinMagMipLinear双线性过滤保证步进采样时边缘不溢出、插值平滑RasterizerStateCullMode 为 None、FrontCounterClockwise 为 true全屏绘制无需剔除参数打包FloatsToBuffer将 Direction、Length、RayColor、Decay、ApplyFXToBackground、Amount 及采样计数经IntToFloat转换统一写入常量缓冲供 shader 读取纹理兜底FirstValidTexture组合了 TextureFX 输入与一张内置白色像素图Lib:images/basic/white-pixel.png当 FX 纹理未连接时使用纯白图等价于无 FX 扰动。实战接线方法与调参建议最小接线在 TiXL 节点图中按以下方式搭建即可获得最基础的光线效果将任意画面视频、文字、图形组合连到ImageDirection设为非零值如 (-0.13, 0.11) 指向左上或用向量算子动态驱动保持其余参数默认Samples100、Length0.4、Decay0.9、Amount5.0、RayColor白色将Output接入渲染目标或直接预览。参考官方示例的进阶玩法仓库自带示例 LightRaysFxExample.t3对应的生成代码见 LightRaysFxExample.cs其中值得借鉴的接线模式包括双 LightRaysFx 叠加示例中先后使用两个 LightRaysFx 实例一个Samples150, Length0.94另一个Length0.85第一层负责长光线主体第二层经Layer2d混合后叠加细节形成层次丰富的光效用 PerlinNoise2 驱动 DirectionDirection不再写死而是由PerlinNoise2振幅 0.4输出驱动让光源中心随时间游走产生呼吸感用 LinearGradient 彩虹渐变作 TextureFX将一条 7 色线性渐变红→黄→绿→青→蓝→紫→红接到 TextureFX利用其 multiply 混合让光线呈现彩色分离的棱镜效果光线中心常配 RadialGradient示例在光路中间叠加了一个径向渐变与白色文字LightRaysFx 文本字号 200配合光线让文字仿佛自带发光源。常见调参方向想要的效果调整方式更细、更平滑的光线提高Samples100 → 200代价是性能更长、更弥散的光线增大Length0.4 → 0.9更聚焦、更短的光线减小Length同时让Decay接近 1彩色/主题色光线修改RayColor的 RGB配合调大Amount提亮光线只出现在高亮区域调大Decay或在 Image 前先做阈值/提亮处理让 FX 纹理只影响光线不影响背景将ApplyFXToBackground调到 0动态光源用动画算子驱动Direction如 PerlinNoise2、AnimValue总结LightRaysFx 是 TiXL 中一款算法透明、可玩性极高的体积光算子其核心是 LightRayFx.hlsl 中沿径向多步采样累加的光线追踪简化实现9 个输入参数分别控制光源中心、采样密度、光线长度、颜色、衰减与混合方式配合可选的 multiply 模式 FX 纹理能够从朴素的白光扫射到复杂的彩色棱镜光效自由调节。官方文档 LightRaysFx.md 中的参数表可以在源码 LightRaysFx.cs、配置 LightRaysFx.t3 与示例 LightRaysFxExample.t3 中逐一印证读者可放心按本文给出的默认值与调参方向直接上手创作。【免费下载链接】t3TiXL is an open source software to create realtime motion graphics.项目地址: https://gitcode.com/GitHub_Trending/t3/t3创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考