Unity TMP_SDF 分析(五)基础片元着色器与 GetColor
Unity TMP_SDF 分析五基础片元着色器与GetColor适用版本Unity2021.3.23f1c1TextMeshPro3.0.9UGUI1.0.0分析范围项目中的标准Assets/TextMesh Pro/Shaders/TMP_SDF.shader及其关联源码Mobile、SSD、Surface 等变体不直接套用。系列导航第 5/9 篇前置字重阈值、裁剪阈值与顶点输出下一篇GLOW_ON辉光路径片元着色器的核心任务是采样 SDF Atlas把归一化距离换算为屏幕尺度距离再生成 Face、Outline 和抗锯齿覆盖率。一、基础源码以下代码保留基础颜色路径并标出与宏相关的入口节选fixed4 PixShader(pixel_t input) : SV_Target { UNITY_SETUP_INSTANCE_ID(input); float c tex2D(_MainTex, input.atlas).a; #ifndef UNDERLAY_ON clip(c - input.param.x); #endif float scale input.param.y; float bias input.param.z; float weight input.param.w; float sd (bias - c) * scale; float outline (_OutlineWidth * _ScaleRatioA) * scale; float softness (_OutlineSoftness * _ScaleRatioA) * scale; half4 faceColor _FaceColor; half4 outlineColor _OutlineColor; faceColor.rgb * input.color.rgb; faceColor * tex2D( _FaceTex, input.textures.xy float2(_FaceUVSpeedX, _FaceUVSpeedY) * _Time.y); outlineColor * tex2D( _OutlineTex, input.textures.zw float2(_OutlineUVSpeedX, _OutlineUVSpeedY) * _Time.y); faceColor GetColor( sd, faceColor, outlineColor, outline, softness); // Bevel / Underlay / Glow / UI Clip 在此后执行。 return faceColor * input.color.a; }weight在基础颜色路径中没有直接参与后续表达式因为它已经被顶点着色器折算进bias开启BEVEL_ON后它还会用于程序化表面法线计算。二、输入字段片元着色器接收的pixel_t关键字段如下字段数据来源用途input.atlas顶点TEXCOORD0采样_MainTexSDF Atlasinput.param.xalphaClipAtlas 采样的早期丢弃阈值input.param.yscale屏幕空间 SDF 缩放量input.param.zbias带字重和半过渡补偿的 Atlas 阈值input.param.wweightBevel 等后续路径使用input.textures.xy解包映射 UV _FaceTex_STFace Texture UVinput.textures.zw解包映射 UV _OutlineTex_STOutline Texture UVinput.colorTMP 顶点颜色Face RGB 和最终整体 Alpha 调制标准 Shader 在UNDERLAY_ON未启用时使用alphaClipclip(c - input.param.x);三、采样 SDF Atlasfloat c tex2D(_MainTex, input.atlas).a;_MainTex是字体 AtlasSDF 数据位于 Alpha 通道。对于本项目使用的 TMP SDF Atlas可按以下方向理解c 较大 → 更靠字形内部 c 较小 → 更靠字形外部 c ≈ 0.5 → 未施加字重偏移时的基础边缘附近SDF Alpha 是经过纹理量化和采样过滤后的归一化距离表示。测试时可以直接输出采样值float c tex2D(_MainTex, input.atlas).a; return fixed4(c, c, c, 1);对应的 SDF 字体图集图集中的字形示例四、alphaClip在完整着色前丢弃无关片元#ifndef UNDERLAY_ON clip(c - input.param.x); #endifHLSLclip(x)在x 0时丢弃片元因此实际条件为c alphaClip → discard c alphaClip → 继续执行alphaClip已在顶点着色器中考虑 Weight、Face Dilate、Outline Width、Outline Softness以及开启 Glow 时的额外范围。它用于排除确定不会对结果产生贡献的 Atlas 外围区域最终颜色边界由GetColor()计算。正常 Underlay 使用偏移 UV 再采样 Atlas可能需要当前c阈值之外的片元所以UNDERLAY_ON变体跳过这次 clip。五、sd的正负方向float scale input.param.y; float bias input.param.z; float sd (bias - c) * scale;由于字形内部的c较大c bias → sd 0 → 更靠字形内部 c bias → sd 0 → 当前字重阈值附近 c bias → sd 0 → 更靠字形外部这是 Face、Outline、Glow 和 Inner Underlay 距离方向的共同基础。scale把 Atlas 值差转换到近似屏幕像素尺度文本在屏幕上较大时scale通常较大同样的 Atlas 值差会形成更陡的sd变化。文本较小时scale较小过渡会更宽以维持抗锯齿稳定性。六、描边宽度与柔化参数float outline (_OutlineWidth * _ScaleRatioA) * scale; float softness (_OutlineSoftness * _ScaleRatioA) * scale;两项材质参数先由_ScaleRatioA限制在 Atlas 的有效距离范围内再乘屏幕空间scale转换到GetColor()使用的sd尺度。这里的“分辨率无关”是近似的屏幕尺度补偿不意味着描边宽度在任何透视角、Atlas 分辨率和极端缩放下都严格保持同一像素数。七、Face、Outline 与顶点颜色half4 faceColor _FaceColor; half4 outlineColor _OutlineColor; faceColor.rgb * input.color.rgb;顶点颜色 RGB 只在这里调制 Face RGB。因此 TMP 顶点渐变主要作用于字面颜色不会直接乘到_OutlineColor.rgb。最终返回时return faceColor * input.color.a;顶点 Alpha 会乘到整个合成结果包括 Face、Outline以及它们之后叠加的 Bevel、Underlay、Glow 和裁剪结果。八、Face/Outline 装饰纹理与 UV 滚动faceColor * tex2D( _FaceTex, input.textures.xy float2(_FaceUVSpeedX, _FaceUVSpeedY) * _Time.y); outlineColor * tex2D( _OutlineTex, input.textures.zw float2(_OutlineUVSpeedX, _OutlineUVSpeedY) * _Time.y);_FaceTex和_OutlineTex是额外的颜色/图案纹理SDF Atlas 位于_MainTex。input.textures来自打包映射 UV 的解包结果。_Time.y × UVSpeed使纹理随时间滚动。纹理采样结果与各自基础颜色按 RGBA 相乘纹理 Alpha 也会影响后续覆盖率。九、GetColor()源码TMPro.cginc中的实现如下fixed4 GetColor( half d, fixed4 faceColor, fixed4 outlineColor, half outline, half softness) { half faceAlpha 1 - saturate( (d - outline * 0.5 softness * 0.5) / (1.0 softness)); half outlineAlpha saturate(d outline * 0.5) * sqrt(min(1.0, outline)); faceColor.rgb * faceColor.a; outlineColor.rgb * outlineColor.a; faceColor lerp( faceColor, outlineColor, outlineAlpha); faceColor * faceAlpha; return faceColor; }参数d就是片元着色器中的sd其方向为“负值在内、正值在外”。十、faceAlpha整个 Face/Outline 合成结果的覆盖率half faceAlpha 1 - saturate( (d - outline * 0.5 softness * 0.5) / (1.0 softness));faceAlpha会在颜色混合之后乘到 Face/Outline 的整体结果上。结合d的方向字形内部d较负括号内值较小faceAlpha接近1。向字形外部移动时d增大faceAlpha逐渐降到0。outline * 0.5把整体可见范围向外推。softness同时移动并加宽过渡区。分母中的常量1.0是基础抗锯齿距离跨度Softness 在此基础上继续加宽。本 Shader 的d正方向朝外因此d增大时faceAlpha逐渐降低。十一、outlineAlphaFace 与 Outline 的颜色选择权重half outlineAlpha saturate(d outline * 0.5) * sqrt(min(1.0, outline));outlineAlpha更准确的含义是“向 Outline Color 插值的权重”内部的d较负权重接近0颜色偏向 Face。接近边缘并向外时d增大权重提高颜色逐渐转向 Outline。outline * 0.5控制转换开始的位置。sqrt(min(1, outline))令窄描边的最大颜色权重低于1并随宽度平滑增加。例如outline 0.25时该乘数为0.5这一项最多贡献一半的 Outline 插值权重。十二、预乘 Alpha 与颜色混合faceColor.rgb * faceColor.a; outlineColor.rgb * outlineColor.a; faceColor lerp(faceColor, outlineColor, outlineAlpha); faceColor * faceAlpha;Shader Pass 使用Blend One OneMinusSrcAlpha因此颜色在输出前采用预乘 Alpha 形式Face 和 Outline 的 RGB 先分别乘自身 Alpha。outlineAlpha在两种预乘颜色之间插值。faceAlpha作为 SDF 几何覆盖率乘到最终 RGBA。片元函数末尾再乘 TMP 顶点 Alpha。这种顺序能让半透明 Face、Outline Texture 和抗锯齿边缘在预乘混合模式下保持一致。十三、基础颜色流程TEXCOORD0 └─ 采样 _MainTex.a → c ├─ 与 alphaClip 比较丢弃确定无贡献的片元 └─ sd (bias - c) × scale ├─ outline / softness ├─ Face 与 Outline 装饰纹理 └─ GetColor() ├─ faceAlpha整体覆盖率 ├─ outlineAlpha颜色插值权重 ├─ 预乘 Face/Outline RGB └─ 输出预乘颜色 └─ × input.color.a最重要的符号结论为在标准TMP_SDF.shader中sd (bias - c) * scale所以sd 0更靠字形内部sd 0更靠字形外部。十四、源码索引Assets/TextMesh Pro/Shaders/TMP_SDF.shaderPixShader()与预乘混合设置。Assets/TextMesh Pro/Shaders/TMPro.cgincGetColor()。Assets/TextMesh Pro/Shaders/TMP_Properties.cginc片元阶段使用的材质 Uniform。Scripts/Runtime/TMP_ShaderUtilities.cs_ScaleRatioA的 CPU 端计算。

相关新闻

英雄联盟客户端效率工具 League Akari:从选人焦虑到对局信息自由的完整上手攻略

英雄联盟客户端效率工具 League Akari:从选人焦虑到对局信息自由的完整上手攻略

英雄联盟客户端效率工具 League Akari:从选人焦虑到对局信息自由的完整上手攻略 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 晚…

2026/8/15 16:57:04 阅读更多 →
UniHacker 使用指南:三平台一键解锁 Unity 授权验证的完整教程

UniHacker 使用指南:三平台一键解锁 Unity 授权验证的完整教程

UniHacker 使用指南:三平台一键解锁 Unity 授权验证的完整教程 【免费下载链接】UniHacker 为Windows、MacOS、Linux和Docker修补所有版本的Unity3D和UnityHub 项目地址: https://gitcode.com/GitHub_Trending/un/UniHacker 凌晨一点,小周终于把 …

2026/8/15 16:56:04 阅读更多 →
Unity 授权验证总把你拦在门外?UniHacker 跨平台本地处理的保姆级上手指南

Unity 授权验证总把你拦在门外?UniHacker 跨平台本地处理的保姆级上手指南

Unity 授权验证总把你拦在门外?UniHacker 跨平台本地处理的保姆级上手指南 【免费下载链接】UniHacker 为Windows、MacOS、Linux和Docker修补所有版本的Unity3D和UnityHub 项目地址: https://gitcode.com/GitHub_Trending/un/UniHacker 你有没有过这样的瞬间…

2026/8/15 16:56:04 阅读更多 →

最新新闻

WinDiskWriter 终极指南:3 步在 Mac 上制作 Windows 启动盘,免费开源还免 TPM

WinDiskWriter 终极指南:3 步在 Mac 上制作 Windows 启动盘,免费开源还免 TPM

WinDiskWriter 终极指南:3 步在 Mac 上制作 Windows 启动盘,免费开源还免 TPM 【免费下载链接】WinDiskWriter 🖥 Windows Bootable USB creator for macOS. 🛠 Patches Windows 11 to bypass TPM and Secure Boot requirements. …

2026/8/15 17:39:16 阅读更多 →
PS4存档工具保姆级上手:用Apollo Save Tool搞定备份、转移与修改

PS4存档工具保姆级上手:用Apollo Save Tool搞定备份、转移与修改

PS4存档工具保姆级上手:用Apollo Save Tool搞定备份、转移与修改 【免费下载链接】apollo-ps4 Apollo Save Tool (PS4) 项目地址: https://gitcode.com/gh_mirrors/ap/apollo-ps4 如果你正在找一款靠谱的PS4存档工具,那么 Apollo Save Tool 很可能…

2026/8/15 17:39:16 阅读更多 →
Audiveris 光学乐谱识别实战指南:从纸质乐谱到可编辑 MusicXML 的完整路径

Audiveris 光学乐谱识别实战指南:从纸质乐谱到可编辑 MusicXML 的完整路径

Audiveris 光学乐谱识别实战指南:从纸质乐谱到可编辑 MusicXML 的完整路径 【免费下载链接】audiveris Latest generation of Audiveris OMR engine 项目地址: https://gitcode.com/gh_mirrors/au/audiveris 你是否有过这样的经历:手头只有一张泛…

2026/8/15 17:39:16 阅读更多 →
Saltpad作业管理功能:轻松调度和跟踪SaltStack任务的完整指南

Saltpad作业管理功能:轻松调度和跟踪SaltStack任务的完整指南

Saltpad作业管理功能:轻松调度和跟踪SaltStack任务的完整指南 【免费下载链接】saltpad A gui and cli to manage saltstack deployments 项目地址: https://gitcode.com/gh_mirrors/sa/saltpad Saltpad是一款专为SaltStack部署打造的图形化管理工具&#xf…

2026/8/15 17:39:16 阅读更多 →
从零搞懂KMS激活工具:KMS_VL_ALL_AIO让Windows和Office激活一步到位

从零搞懂KMS激活工具:KMS_VL_ALL_AIO让Windows和Office激活一步到位

从零搞懂KMS激活工具:KMS_VL_ALL_AIO让Windows和Office激活一步到位 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 很多人的电脑都经历过这样的"深夜惊吓":赶…

2026/8/15 17:39:16 阅读更多 →
060、亿智/星宸AI ISP平台全链路适配:从Sensor驱动到3A算法的快速bringup与量产验证

060、亿智/星宸AI ISP平台全链路适配:从Sensor驱动到3A算法的快速bringup与量产验证

060、亿智/星宸AI ISP平台全链路适配:从Sensor驱动到3A算法的快速bringup与量产验证 上周在客户现场调一块基于星宸SSD238的AI IPC方案,画面出来偏紫红色,客户FAE第一反应是白平衡没跑起来,我拿示波器量了MCLK和PCLK的相位,又翻了半天sensor的HTS/VTS配置,最后发现是驱动…

2026/8/15 17:38:16 阅读更多 →

日新闻

内景 空间站内部 中国空间站 太空 内仓

内景 空间站内部 中国空间站 太空 内仓

本项目为前几天收费帮学妹做的一个项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。 一、项目描述 空间站内部 中国空间站 太空 内仓 地址:本地PC端运行(或Web…

2026/8/15 0:00:30 阅读更多 →
重新定义数据接口:3个突破性场景让通达信数据读取更智能

重新定义数据接口:3个突破性场景让通达信数据读取更智能

重新定义数据接口:3个突破性场景让通达信数据读取更智能 【免费下载链接】mootdx 通达信数据读取的一个简便使用封装 项目地址: https://gitcode.com/GitHub_Trending/mo/mootdx 当我们面对海量金融数据时,传统的数据获取方式往往让我们陷入困境—…

2026/8/15 0:00:30 阅读更多 →
一文读懂快消WMS怎么选?2026年国内外10大主流WMS品牌盘点

一文读懂快消WMS怎么选?2026年国内外10大主流WMS品牌盘点

快消品(FMCG)是流通速度较快、竞争较为激烈的行业之一。一瓶饮料从出厂到消费者手中,往往只有几十天甚至几天的周转窗口。这决定了快消行业的仓储管理系统(WMS)与制造业、电商行业存在明显区别:它不仅需要管…

2026/8/15 0:02:30 阅读更多 →

周新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/13 2:38:34 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/15 12:59:14 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/13 10:41:51 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/14 13:40:53 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/14 14:06:45 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/15 2:35:29 阅读更多 →