- 博客(62)
- 收藏
- 关注
原创 Unity TMP_SDF 分析(七)宏相关部分2
顶点着色器:为 Underlay 计算一套独立的、包含位移(Offset)、粗细(Dilate/Bias)、柔边(Softness/Scale)的参数。像素着色器 (: 使用这套参数渲染一个偏移、变形后的字形,并利用将它混合在原始字形的下方和外部。像素着色器 (: 使用这套参数渲染一个变形后的字形,但通过反转 Alpha和额外遮罩,确保它只被绘制在原始字形的内部和下方。
2026-05-21 10:26:31
508
原创 Unity TMP_SDF 分析(六)宏相关部分
在文字本来的轮廓之外绘制东西。这意味着 GPU 需要处理比原来更大的像素区域。在这个额外的区域内,根据离文字边缘的距离,计算出平滑衰减的辉光颜色。您提供的代码完美地展示了 TMP 是如何实现这两点的。代码行任务结果1重新定位将距离场的0点从文字轮廓移到辉光内边缘2计算宽度得到辉光渐变带的总宽度t3标准化将距离转换为0-1的线性渐变4塑造曲线应用Falloff,并将渐变反转 (1=亮, 0=暗)5优化细节优雅地处理宽度小于 1 像素的辉光,防止锯齿6合成颜色。
2026-05-21 10:26:07
383
原创 Unity TMP_SDF 分析(五)片元着色器
这段代码解析了一个基于距离场(SDF)的字体渲染片元着色器,其核心功能是通过有符号距离场实现高质量的文字渲染效果。关键点包括: 使用距离场纹理采样获取每个像素到字形边缘的距离值 通过参数控制字体粗细(bias)、缩放(scale)和加粗(weight) 计算标准化距离(sd)来确定像素位置(内部/边缘/外部) 动态计算描边宽度(outline)和软化度(softness) 混合面部颜色(faceColor)和描边颜色(outlineColor) 支持纹理动画、顶点颜色调制和透明度控制 该着色器实现了高质量的
2026-04-23 20:02:33
436
原创 Unity TMP_SDF 分析(四)顶点着色器2
本文解析了TMP字体渲染中的权重计算逻辑。通过lerp(_WeightNormal, _WeightBold, bold)函数根据粗体标志选择对应字重,再经过/4.0缩放适配SDF采样范围。随后叠加全局膨胀参数_FaceDilate,并通过动态计算的_ScaleRatioA确保不同缩放下的视觉一致性,最后用*0.5优化边缘质量。文中还详细说明了_ScaleRatioA的计算过程,该值基于字体缩放、膨胀、描边等参数动态调整,保证渲染效果清晰锐利。整个流程实现了字体粗细的自适应控制。
2026-03-19 20:35:56
510
1
原创 Unity TMP_SDF 分析(三)顶点着色器1
该顶点着色器主要用于处理文本渲染效果,包含以下核心功能: 顶点处理:应用位置偏移并转换到裁剪空间 文本效果计算: 粗体判断(通过texcoord1.y符号) 动态计算像素尺寸和缩放比例 处理透视和正交投影差异 生成UV坐标: 用于遮罩纹理 面部和轮廓纹理坐标变换 输出数据结构: 包含位置、颜色、UV等渲染参数 计算权重和偏置值用于后续片段处理 着色器通过复杂的数学运算实现了高质量文本渲染效果,支持粗体、轮廓、抗锯齿等特性。
2026-03-19 20:35:04
412
原创 Unity TMP_SDF 分析(一)数据来源1
xScale│ C# 端 ││ ↓ ││ 计算 uv2.x (映射模式) + uv2.y (xScale) ││ ↓ ││ PackUV() 编码 ││ ↓ │↓│ Shader 端 ││ ↓ ││ texcoord1.y → 粗体检测 (正/负) + SDF 缩放 (绝对值) ││ ↓ ││ UnpackUV(texcoord1.x) → 恢复 UV 坐标 ││ ↓ ││ 应用边缘权重、渐变、清晰度等效果 │。
2026-03-10 20:07:55
455
1
原创 Unity TMP_SDF 分析(二)数据来源2
本文分析了TextMeshPro中uv.x的数据来源,主要介绍了四种UV映射模式: Character模式:每个字符的UV独立归一化到[0,1],适合逐字动画效果 Line模式:以行为单位计算UV,使用行包围盒(lineExtents)进行归一化 Paragraph模式:以整个段落为单位,使用全局包围盒(m_meshExtents)归一化 MatchAspect模式(未展开) 关键点: UV坐标存储在字符的四个顶点中 不同模式使用不同范围的包围盒进行归一化计算 适用于字符、行或段落级别的视觉效果控制
2026-03-10 20:05:47
507
原创 C#方法的生命周期与内存布局
方法在内存中的存储位置 核心要点 方法代码:方法的IL代码存储在程序元数据中,JIT编译后存放在内存的"代码区"或"方法区" 方法元数据:方法名称、参数、返回类型等信息存储在元数据区 运行时数据:方法调用时的局部变量和参数存储在调用栈上 实例字段:存储在堆上 关键特性 方法代码共享:所有实例共享同一份方法实现,不会随实例数量复制 泛型方法特例:值类型泛型会导致JIT生成多份机器码 JIT编译:首次调用时IL代码被编译为本地机器码并缓存 调用过程:方法调用时在栈上创建栈
2026-02-09 20:56:55
899
原创 Unity Standard Shader 解析(六)之Deferred
本文摘要介绍了Unity延迟渲染着色器中的顶点处理部分。主要内容包括:1) 定义VertexOutputDeferred结构体,包含顶点位置、纹理坐标、视角向量等数据;2) vertDeferred函数实现顶点变换和属性计算,包括模型到世界/裁剪空间转换、法线/切线处理、光照贴图UV计算等;3) 支持多种渲染特性如视差映射、动态光照贴图和GPU实例化。该代码是Unity标准着色器的核心部分,负责为延迟渲染管线准备顶点数据。
2026-02-09 20:18:01
681
原创 Unity UGUI Image解析(二)
文章摘要: 该代码片段展示了Unity中两种径向填充方法(Radial90和Radial180)的实现细节。Radial90方法通过三角函数计算填充角度,根据顺时针/逆时针方向调整顶点坐标,包含三种不同情况处理(sin>cos、cos>sin和相等情况)。Radial180方法则将区域分为左右或上下两部分,通过循环处理每半边区域的填充,根据填充原点(fillOrigin)决定填充顺序和范围。两种方法都使用插值计算顶点位置,实现平滑的径向填充效果。
2026-01-30 12:05:23
926
1
原创 Unity UGUI Image解析(一)
Unity UI中的Image组件继承自MaskableGraphic,通过重写OnPopulateMesh方法实现不同渲染类型。当类型为Simple时,根据useSpriteMesh设置选择生成方式:false时生成简单四边形顶点数据,true时则使用精灵网格。此外还支持Sliced、Tiled和Filled三种渲染类型,分别实现9宫格、平铺和填充效果。整个渲染流程通过Canvas系统的Rebuild方法触发,最终生成网格数据传递给CanvasRenderer进行绘制。
2026-01-28 20:12:11
1145
原创 Unity UI 核心机制:CanvasUpdateRegistry 详解
Unity UI 采用延迟重建机制优化性能,通过CanvasUpdateRegistry管理UI元素更新。核心组件实现ICanvasElement接口,在特定阶段执行重建操作。系统维护布局和图形两个重建队列,每帧按阶段(Prelayout→LatePreRender)依次处理。更新前会清理无效元素并按层级排序,确保父节点优先更新。整个过程通过性能采样监控,异常会被捕获并记录。这种机制避免了频繁重绘,提升了UI渲染效率。
2026-01-21 10:49:48
950
原创 C#闭包陷阱2
C#闭包在循环中的陷阱:IL代码揭示共享变量问题 文章通过一个Unity中的C#闭包示例,揭示了在for循环中使用闭包时常见的变量共享陷阱。当多个闭包捕获同一个循环变量时,它们实际上共享的是同一个闭包类实例,导致所有委托最终都引用循环结束时的变量值。通过分析IL代码发现:编译器只在循环外创建了一个闭包实例,循环中所有委托都指向该实例;每次循环修改的是同一个字段,导致最终所有闭包都输出相同值。解决方法是在循环内创建局部变量副本,确保每个闭包捕获独立的变量实例。
2025-12-25 19:42:58
750
原创 C#闭包陷阱1
看 IL 代码的开头部分,编译器生成了一个嵌套类。// ...// 证据 1:大数组在这里// 证据 2:小计数器也在这里// ...编译器强行把hugeData(100MB)和counter(4字节)关进了同一个类里。它们现在的命运已经绑定在一起了。合并hugeData和counter被合并到了同一个类中。共享:虽然useCounter(即b__1) 的代码逻辑里根本没出现hugeData(见 IL_0000 到 IL_002a 部分),但因为b__1是个实例方法),它必须持有this指针。
2025-12-25 19:36:35
615
原创 C# Stack源码分析
本文介绍了.NET中的Stack<T>类,这是一个基于数组实现的后进先出(LIFO)集合类型。文章详细分析了其内部结构,包括存储元素的数组_array、栈顶指针_size和版本号_version字段。重点讲解了核心操作方法:Push入栈(均摊O(1))、Pop出栈(O(1))和Peek查看栈顶(O(1)),以及安全版本的TryPop和TryPeek。此外还介绍了查询方法Contains(O(n))、清空操作Clear、数据转换方法ToArray和内存优化方法TrimExcess。Stack<
2025-12-08 14:53:40
1050
原创 投影矩阵公式推导
本文详细阐述了3D图形学中透视投影和正交投影的数学原理与实现方法。 透视投影部分重点介绍了如何将视锥体映射到齐次裁剪空间(NDC): 通过三角形相似原理推导x/y坐标的投影公式 构建非线性z坐标映射函数以保持深度精度 推导出完整的4×4透视投影矩阵,分析各矩阵项的作用 解释深度值的非线性映射特性及特殊处理 正交投影部分则说明平行投影的线性特性: 直接线性映射x/y坐标到NDC空间 反向线性映射z坐标 构建更简单的正交投影矩阵 两种投影方法都通过4×4变换矩阵实现,但透视投影需要额外的透视除法步骤(除以w分量
2025-11-10 20:10:35
1181
原创 透视校正插值原理
本文阐述了3D图形处理中三角形光栅化的插值方法。在投影平面上,三角形面的正确插值需要非线性方法以避免纹理扭曲。深度插值通过线性计算1/z实现(式5.33),而顶点属性(如颜色和纹理坐标)的插值需结合深度信息进行透视校正(式5.37)。具体实现时,图形处理器先线性插值1/z和b/z,再通过计算获得最终属性值。较老硬件对某些属性仍使用线性插值,因为其对视觉效果影响较小。
2025-10-15 15:37:42
987
原创 Unity UI坐标说明
本文通过Unity UI系统的RectTransform组件,详细分析了不同对齐方式下各参数的计算逻辑。在X轴拉伸情况下,分别测试了向上、居中、向下对齐方式,解析了anchoredPosition、offsetMin/Max、sizeDelta等参数的含义和计算方法。在Y轴拉伸情况下,测试了左、中、右对齐方式,同样解释了各参数的计算原理。文章采用图文结合的方式,通过示意图和参数面板截图,直观展示了UI元素在不同对齐方式下的属性变化,帮助开发者深入理解RectTransform的工作原理。
2025-09-15 19:54:12
917
原创 Unity Standard Shader 解析(五)之ShadowCaster
以下是UnityStandardCoreForward.cginc的源码,
2025-09-04 20:52:28
505
1
原创 C# Queue源码分析
Queue<T> 是 .NET 中的泛型队列类,采用循环数组实现先进先出(FIFO)操作。核心字段包括_array(存储元素)、_head(队头)、_tail(队尾)和_size(元素数量)。主要方法包括: Enqueue:入队时自动扩容(默认翻倍); Dequeue/TryDequeue:出队操作; Peek/TryPeek:查看队首; Clear:清空队列时处理引用类型。通过环形数组设计减少数据移动,支持动态扩容,但不保证线程安全。
2025-08-18 20:05:28
1083
原创 Unity Standard Shader 解析(四)之ForwardAdd(简化版)
特性/功能输出结构体雾效处理法线和切线空间处理根据_NORMALMAP处理根据处理视线方向处理仅在时计算始终计算并存储光照方向处理直接存储或传递给分别存储在的.w分量中支持视差贴图否是 (通过宏)反射向量计算在时计算不计算。
2025-07-30 20:02:43
718
原创 C# StringBuilder源码分析
`StringBuilder` 是 .NET 中对字符串拼接进行优化的经典案例。它通过巧妙地结合字符数组和链表结构,在保证灵活性的同时,也兼顾了性能。
2025-07-16 20:56:56
1266
原创 C# Dictionary源码分析
功能实现方式插入键值对通过_entries和_buckets组织成哈希表结构处理重复键使用控制行为(抛异常 / 覆盖 / 忽略)值类型优化使用默认比较器并允许 JIT 去虚化和内联优化空间复用使用_freeList和_freeCount重用删除后的槽位扩容机制当空间不足时调用Resize(),自动扩展容量安全防护检测循环引用、哈希碰撞攻击等安全问题特性实现方式高性能使用哈希表 + 值类型优化灵活支持自定义比较器安全检查空键、循环引用、DoS 攻击防护空间管理。
2025-07-07 20:47:32
960
1
原创 C# List源码分析
摘要: 本文分析了C# List<T>类中Add、EnsureCapacity和Insert方法的实现机制。Add方法通过检查内部数组容量,必要时调用EnsureCapacity扩容,再添加元素并更新版本号。EnsureCapacity采用默认容量4或双倍扩容策略,同时处理整数溢出和最大数组长度限制。Insert方法在指定位置插入元素,涉及边界检查、容量管理和数据移动。这些方法共同支持List<T>的动态扩容特性,均摊时间复杂度为O(1)。通过源码解析揭示了底层数组管理、版本控制和安
2025-06-25 20:52:21
932
原创 Unity UI 核心类解析之Graphic
在 Unity 的 UI 系统中,Graphic是一个抽象基类,继承自并实现了接口。它是所有可以被绘制到屏幕上的 UI 元素的基础类。如按钮、文字、图片等,都直接或间接继承自Graphic。
2025-06-19 20:46:12
708
原创 Unity UGUI GraphicRaycaster.Raycast详解
Unity UI射线检测摘要:该方法用于执行Canvas上UI元素的点击/触碰检测,主要处理以下逻辑:(1)获取可交互UI元素;(2)处理多显示器坐标转换;(3)根据Canvas渲染模式计算视口坐标;(4)检测3D/2D阻挡物;(5)执行实际UI射线检测。关键特性包括:支持ScreenSpaceOverlay和Camera渲染模式、多显示器兼容、阻挡物检测(3D/2D对象遮挡UI)、以及编辑器特殊处理。最终将有效命中结果存入返回列表,用于后续UI事件处理。(150字)
2025-06-11 16:55:07
1411
原创 Unity UGUI Button事件流程
本文解析了Unity UI系统中Button点击事件的完整触发流程:从EventSystem每帧调用Update()开始,通过StandaloneInputModule检测鼠标状态,最终调用Button的OnPointerClick()方法。关键点包括:1)EventSystem作为事件调度中心;2)StandaloneInputModule处理输入逻辑;3)Button组件实现IPointerClickHandler接口。当满足点击条件时,系统会通过ExecuteEvents.Execute()调用注册的
2025-06-09 19:55:12
1729
1
原创 Unity UI系统中RectTransform详解
表示Child中心点相对于锚点原点的偏移。: 表示Child与锚点之间的偏移量。sizeDelta: 表示Child相对于Parent的尺寸变化。rect: 表示Child自身的矩形区域。: 定义Child的锚点位置。
2025-05-30 16:22:18
2015
原创 Unity 内置Standard Shader UNITY_BRDF_PBS函数分析 (二)
BRDF1_Unity_PBS 的实现基于 Disney 工作,并以 Torrance-Sparrow 微面模型为基础,使用了多种不同的组件来计算最终的 BRDF(双向反射分布函数)。
2025-04-24 19:33:29
1009
1
原创 Unity Standard Shader 解析(三)之ForwardBase(简化版)
通过这些对比,可以看出是一个较为简化版本的顶点着色器,主要用于基本的渲染需求;而则是一个功能更全面的顶点着色器,支持更多的高级特性如视差映射、切线空间转换等。更加复杂,适用于更全面的物理基础渲染(PBR),并且支持更多高级特性如实例ID和立体视觉等。则更加简化,适用于基本的光照和材质计算,性能更高但功能相对较少。这两个函数的选择取决于具体的渲染需求和性能考量。
2025-04-10 20:32:29
936
1
原创 Unity Internal-ScreenSpaceShadows 分析
同HardShadow_FORCE_INV_PROJECTION_IN_PS。同HardShadow。同HardShadow。同HardShadow。同HardShadow。同HardShadow。
2025-04-07 20:13:11
543
原创 Unity Standard Shader 解析(二)之ForwardAdd(标准版)
适用于基本的前向渲染路径,处理所有类型的光源(包括主光源)和全局光照,提供更全面的光照计算。:适用于附加光源的前向渲染路径,主要用于叠加额外的点光源或聚光灯,简化了光照计算,不涉及全局光照和自发光。这两种函数的设计目的是为了优化不同场景下的渲染效率,同时保证渲染质量和效果的一致性。
2025-04-02 20:15:22
1154
原创 Unity Standard Shader 解析(一)之ForwardBase(标准版)
用途:处理基本光照计算,包括方向光、自发光、光照贴图等。特点支持多种材质特性,如法线贴图、金属度光泽贴图、透明度测试/混合等。使用多编译指令来适应不同的硬件能力和性能需求。
2025-03-27 19:57:01
519
原创 Unity 内置Standard Shader UNITY_BRDF_PBS函数分析 (一)
改定义在UnityPBSLighting.cginc文件里。都在UnityStandardBRDF.cginc里。
2025-03-20 15:32:34
637
原创 UnityShader Linear01Depth和LinearEyeDepth函数
UnityShader Linear01Depth和LinearEyeDepth函数
2025-02-26 10:38:28
1402
原创 Unity 中 多种资源加载方式的优缺点
方式用途优点缺点编辑器环境方便调试,路径明确仅限编辑器,性能问题Resources运行时加载简单易用,自动打包性能问题,内存占用高,组织困难高效加载,按需加载高性能,按需加载,动态下载,灵活性复杂性高,学习曲线陡峭自定义打包,按需加载按需加载,动态下载,版本控制复杂性高,维护成本高,性能开销存储数据对象数据驱动,编辑器友好,灵活性性能开销,组织复杂性Prefabs实例化对象预设对象,实例化快,编辑器友好内存占用,版本控制存储原始文件原始文件,只读访问,异步加载只读,限制性。
2024-11-26 21:45:28
2157
原创 Unity 中 Application 四种常用目录总结
这些路径在不同平台上的具体路径可能会有所不同,但它们的用途和行为是相似的。通过正确使用这些路径,可以确保应用程序在不同平台上都能正确地管理和访问文件。
2024-11-25 19:37:51
2019
Complete Game Template With 1200 levels v1.2.4
2024-04-09
Advanced Survival Kit for Playmaker FPS Game Template 1.2
2024-04-09
Cinema Director - Timeline Cutscene Editor v1.6.2.0
2024-04-09
Cinema Pro Cams - Film Lens 3D Toolkit v1.4.4.0
2024-04-09
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅