拓冰建站拓冰建站
首页 / 资讯中心 / 正文

TiXL NormalMap 操作符详解:将图像亮度实时转换为可用于 PBR 材质的法线贴图

TiXL NormalMap 操作符详解将图像亮度实时转换为可用于 PBR 材质的法线贴图【免费下载链接】t3TiXL is an open source software to create realtime motion graphics.项目地址: https://gitcode.com/GitHub_Trending/t3/t3本篇技术指南围绕 TiXLt3开源实时动态图形软件中的NormalMap图像操作符展开它位于 Lib.image.use 算子库中功能是把输入纹理的亮度信息实时转换为法线贴图Normal Map供 SetMaterial 等 PBR 材质系统使用。读完本文你将掌握 NormalMap 的全部 8 个输入参数的作用与取值范围、4 种输出模式的区别以及其底层 HLSL 着色器的梯度差分与法线重建算法能够在自己的 TiXL 工程中快速搭建灰度高度图 → 法线贴图 → PBR 材质的完整链路。NormalMap 是什么在实时渲染中法线贴图通过在纹理的 RGB 通道中编码表面法线方向让低面数网格呈现出远超其几何细节的表面凹凸质感。法线贴图通常由高模烘焙生成但 TiXL 的NormalMap操作符提供了一条完全实时、无需预烘焙的路径直接以任意图像的亮度Brightness作为高度场输入在 GPU 上逐像素计算梯度并重建法线。根据官方文档描述该操作符将图像的亮度转换为法线贴图可用于 SetMaterial。其典型应用场景包括把噪声纹理、云纹、液态/流动贴图实时转换为动态法线赋予表面流动感用音频驱动的灰度图形生成随节拍起伏的凹凸表面在 SetMaterial 的NormalMap输入上动态叠加细节无需更换几何体。输入参数总览NormalMap共暴露 8 个输入参数官方文档给出的完整参数表如下名称相关度与类型说明LightMap(Texture2D)作为高度场来源的输入纹理Impact(Single)法线凸起强度梯度缩放系数SampleRadius(Single)梯度差分采样半径像素Resolution(Int2)输出分辨率控制Twist(Single)法线方向旋转角度Mode(Int32)输出模式选择映射为枚举OutputFormat(Format)输出纹理的 DXGI 格式TextureRepeat(TextureAddressMode)采样时的纹理寻址模式对应地NormalMap.cs 中定义了这些插槽及各自稳定的 GUID其中Mode插槽带有MappedType typeof(Modes)标注意味着在 TiXL 编辑器中它以下拉枚举的形式呈现而不是裸露的整数。输出名称类型OutputT3.Core.DataTypes.Texture2D输出为一张Texture2D可直接连接给 SetMaterial 的NormalMap输入Texture2D类型也可继续交给其他图像操作符做后处理。各参数深入解析LightMap高度场来源作为唯一的纹理输入LightMap提供高度场数据。从 NormalMap.hlsl 的实现看着色器将其绑定为Texture2Dfloat4 DisplaceMap : register(t0)通过DisplaceMap.GetDimensions()获取实际纹理尺寸用于归一化采样步长。它既可以连接图片加载算子也可以是任意实时生成的纹理。Impact法线强度Impact默认值 1.0见 NormalMap.t3直接缩放梯度向量在着色器中表现为len * direction * Impact随后才被用于重建法线。数值越大高度差被放大得越明显法线越陡峭表面凹凸感越强设为 0 时梯度长度归零法线退化为垂直表面方向凹凸效果消失。它适合作为主强度旋钮或由音频/动画曲线驱动。SampleRadius差分采样半径SampleRadius默认值 2.0控制梯度差分时在 X/Y 方向上偏离中心像素的距离。HLSL 中的归一化逻辑为float sx SampleRadius / (float)displaceMapWidth; float sy SampleRadius / (float)displaceMapHeight;即以输入纹理的宽、高分别归一化该像素偏移量随后采样中心点左右两侧的四个邻域像素cx1/cx2/cy1/cy2做有限差分。半径越大捕捉到的低频起伏越多细节被平滑法线越柔和半径越小越能保留高频细节但噪声也更明显。Resolution输出分辨率ResolutionInt2用于控制输出的尺寸。默认配置为X: 0, Y: 0结合 TiXL 图像链路的惯例可推断该默认值表示不强制指定、沿用着色器目标尺寸即输入/目标纹理分辨率显式给定 X/Y 值则可固定法线贴图的分辨率。对于大尺寸纹理上的高频细节适当提高分辨率可避免采样混叠。Twist法线方向旋转Twist默认值 180.0以度为单位对法线方向做整体旋转。着色器中将其转换为弧度后叠加到梯度角度上float angle (d.x 0 d.y 0) ? 0 : atan2(d.x, d.y) Twist / 180 * 3.141592;当d.x与d.y同时为 0平坦区域时角度取 0避免atan2出现不确定结果。默认 180° 意味着方向向量整体翻转半个圆周可用来修正不同来源高度图如左手/右手习惯、UV 朝向带来的法线方向不一致问题。Mode四种输出模式Mode是 Int32在编辑器中映射为 NormalMap.cs 中定义的枚举枚举值名称含义0Gray_ToNormalizedRGB灰度高度 → 归一化到 [0,1] 的 RGB 法线1Gray_ToNormalizedRGBSigned灰度高度 → 带符号[-1,1]的 RGB 法线2Gray_ToAngleAndMagnitude输出角度 幅度双通道编码3Red_ToRG_KeepBA基于红色通道差分RG 存方向、保留原图 BAHLSL 侧用四个哨兵常量0.5 / 1.5 / 2.5 / 3.5划分区间实现多分支Mode 0Gray_ToNormalizedRGB计算法线normalize(float3(len * direction * Impact, 1))翻转 Y 通道normal.y -normal.y以匹配常见引擎的法线空间约定再执行normal / 2 0.5映射到 [0,1]适合存放到无符号格式并直接接入大多数渲染管线的NormalMap槽Mode 1Gray_ToNormalizedRGBSigned同样重建法线并翻转 Y但不做[0,1] 映射直接输出带符号法线适合需要保留负值精度的场景配合半浮点OutputFormat使用Mode 2Gray_ToAngleAndMagnitude不再输出法线向量而是输出(mod(-angle, 2π), len * Impact, 0, 1)将梯度方向编码为角度、梯度长度编码为幅度适合在自定义着色器中二次处理如扭曲方向场Mode 3Red_ToRG_KeepBA梯度差分改基于红色通道详见下文算法解析RG 通道写入方向分量len * direction * Impact 0.5而 B、A 通道直接透传原图uvImage.ba适合把法线方向与原有数据如透明度、材质 ID打包在同一张纹理里。OutputFormat输出纹理格式OutputFormat默认R16G16B16A16_Float决定输出纹理的 DXGI 格式。默认的半浮点格式对法线贴图尤其友好既能以更高精度存储 Mode 1 输出的负值法线也能在角度/幅度模式下保留更宽的数值范围若只需把结果喂给对精度不敏感的显示链路也可切换为更省显存的 8 位格式。TextureRepeat纹理寻址模式TextureRepeat默认MirrorOnce控制着色器采样时的寻址行为。从 NormalMap.t3 的连接关系看该参数会覆盖内部_ImageFxShaderSetupStatic的Wrap输入内部默认Wrap。当SampleRadius导致采样点越过纹理边界时MirrorOnce采用镜像平铺可避免接缝处出现突兀的梯度跳变——对于需要无缝循环的高度场如平铺噪声非常实用。底层实现NormalMap.hlsl 的梯度差分与法线重建NormalMap在架构上是一个复合算子其符号定义 NormalMap.t3 内部组合了_ImageFxShaderSetupStatic与IntToFloat子节点将着色器源指向Lib:shaders/img/fx/NormalMap.hlsl各输入参数通过命名插槽绑定到着色器ParamConstants常量缓冲区。核心算法位于 NormalMap.hlsl 的psMain可概括为三步1. 四邻域有限差分。以当前像素为中心沿 X/Y 各偏移sx/sy采样四个点计算梯度float2 d Mode Red_ToRG_KeepBA ? float2((grayX1 - grayX2), (grayY1 - grayY2)) : float2((cx1.r - cx2.r), (cy1.r - cy2.r));从源码结构可以推断默认Mode ≤ 3时差分基于红色通道Red_ToRG_KeepBA的命名即源于此仅当 Mode 被驱动到 3.5 以上时才切换为 RGB 平均灰度差分grayX/grayY。换言之亮度转法线在实现上以红通道作为亮度代理如需真正的全通道亮度转换可通过参数动画将 Mode 推过 3.5 边界。2. 角度与幅度分解。梯度向量d被分解为方向角atan2(d.x, d.y)叠加Twist与模长len方向单位向量由float2(sin(angle), cos(angle))重建。3. 按 Mode 输出。法线模式0/1将len * direction * Impact作为 XY 分量与 Z1 组成三维向量并归一化这正是高度场越陡、法线越倾斜的数学本质随后按模式决定是否做 [0,1] 映射与 Y 翻转。默认配置一览以下为 NormalMap.t3 中记录的出厂默认值可直接作为参数调优的起点参数默认值LightMapnull需手动连接SampleRadius2.0OutputFormatR16G16B16A16_FloatTwist180.0Impact1.0Resolution0 × 0TextureRepeatMirrorOnceMode0与 SetMaterial 配合构建 PBR 材质NormalMap的输出专为 SetMaterial 设计。在其 C# 实现 SetMaterial.cs 中NormalMap输入槽接收Texture2D并在每帧更新时通过UpdateSrv将纹理封装为ShaderResourceView挂载到PbrMaterial.NormalSrv纹理发生脏标记变化或 SRV 尚不存在时才重建未连接或失效时回退到默认法线 SRV。这意味着你可以把NormalMap.Output直接接到SetMaterial.NormalMap得到一套完整的实时 PBR 材质管线任何灰度/彩色纹理 → NormalMap → SetMaterial.NormalMap → PBR 渲染仓库中还提供了官方示例算子 NormalMapExample.cs位于Examples.Lib.image.transform命名空间展示了该算子的引用与集成方式可作为搭建自己演示工程的参考。小结NormalMap是 TiXL 图像处理链路中把任意纹理升级为PBR 法线贴图的关键桥梁8 个输入参数覆盖了来源LightMap、强度Impact、细节尺度SampleRadius、方向Twist、输出格式与寻址方式4 种 Mode 则分别面向常规渲染、带符号法线、方向场数据与通道打包四类需求。配合本文梳理的 NormalMap.hlsl 梯度差分算法与 SetMaterial.cs 的 SRV 挂载机制你可以完全基于实时生成的纹理构建动态、可参数化驱动的法线细节而不必依赖任何离线烘焙流程。【免费下载链接】t3TiXL is an open source software to create realtime motion graphics.项目地址: https://gitcode.com/GitHub_Trending/t3/t3创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门