在Unity的Shader Graph中,Transformation Matrix节点是一个功能强大且基础的工具,它允许着色器开发者访问和使用Unity渲染管线中的各种变换矩阵。这些矩阵在计算机图形学中扮演着至关重要的角色,它们定义了物体如何从局部空间转换到世界空间,再到视图空间,最终到裁剪空间的过程。理解并正确使用这些变换矩阵是实现复杂视觉效果和优化着色器性能的关键。
Transformation Matrix节点通过提供一个统一且易于使用的接口,简化了在着色器中处理空间变换的复杂性。无论是实现高级光照效果、创建动态材质,还是优化渲染性能,这个节点都是不可或缺的工具。它特别适用于需要精确控制顶点位置或方向的计算,如顶点着色器中的自定义变换、片元着色器中的高级光照计算,以及各种后处理效果。
描述
Transformation Matrix节点的核心功能是在着色器中定义通用的变换矩阵常量值。它输出一个4x4的矩阵,这个矩阵代表了从下拉菜单中选择的特定空间变换。4x4矩阵是计算机图形学中的标准表示形式,因为它能够同时处理三维空间的线性变换(旋转、缩放)和平移操作,这对于完整的空间变换是必需的。
该节点提供了多种变换矩阵选项,包括模型矩阵、视图矩阵、投影矩阵以及它们的各种组合和逆矩阵。每个选项对应着渲染管线中不同阶段的坐标变换,让开发者能够精确控制顶点和向量在不同空间中的表示和计算。
需要注意的是,该节点的两个输出值选项------"反投影"(Inverse Projection)和"反视图投影"(Inverse View Projection)与Unity的内置渲染管线不兼容。当选择这两个选项并将内置渲染管线作为目标时,节点将产生完全黑色的结果。这一限制主要源于内置渲染管线与通用渲染管线(URP)和高清渲染管线(HDRP)在矩阵计算和传递方式上的差异。在URP和HDRP中,这些逆矩阵被预计算并可供使用,而在内置渲染管线中则不是这种情况。
变换矩阵的基本概念
在深入探讨Transformation Matrix节点的具体用法之前,理解变换矩阵的基本概念是至关重要的。在三维计算机图形学中,变换矩阵用于描述点、向量或坐标系从一个空间到另一个空间的转换。这些转换可以包括:
- 平移:改变对象的位置
- 旋转:改变对象的方向
- 缩放:改变对象的大小
- 剪切:使对象的部分相对于其他部分滑动
在Unity的渲染管线中,顶点通常经历以下空间变换序列:
- 局部空间(Local Space):顶点相对于其自身原点的位置
- 世界空间(World Space):顶点相对于场景世界原点的位置
- 视图空间(View Space):顶点相对于相机的位置和方向
- 裁剪空间(Clip Space):顶点经过投影变换后的位置,用于确定哪些部分在视锥体内
- 屏幕空间(Screen Space):顶点在最终渲染画面中的位置
Transformation Matrix节点提供的各种矩阵正是用于在这些不同空间之间进行转换。
矩阵的数学基础
4x4变换矩阵在计算机图形学中采用齐次坐标系统,这使得它们能够统一处理三维变换和投影。一个典型的4x4变换矩阵可以表示为:
css
[ m00 m01 m02 m03 ]
[ m10 m11 m12 m13 ]
[ m20 m21 m22 m23 ]
[ m30 m31 m32 m33 ]
其中:
- 左上角的3x3子矩阵通常表示旋转和缩放
- 最右侧的3x1列向量(m03, m13, m23)表示平移
- 最底部的1x4行向量(m30, m31, m32, m33)用于透视投影
在着色器编程中,理解这些矩阵的结构和数学特性对于正确使用Transformation Matrix节点至关重要。
端口

Transformation Matrix节点的端口设计简洁而高效,只包含一个输出端口,这反映了它的核心功能------提供预定义的变换矩阵值。
| 名称 | 方向 | 类型 | 绑定 | 描述 |
|---|---|---|---|---|
| Out | 输出 | Matrix 4 | 无 | 输出值 |
输出端口详细解析
Transformation Matrix节点的唯一输出端口"Out"提供所选的4x4变换矩阵。这个输出端口可以连接到任何接受Matrix 4类型输入的节点,如Transform节点、Matrix Construction节点,或自定义函数节点。
输出端口的特性包括:
- 数据类型:Matrix 4,即4x4浮点数矩阵
- 绑定:无,表示这个值不是从材质属性或其它外部源绑定,而是由Unity渲染管线内部生成
- 动态性:根据所选的矩阵类型,输出值可能在每一帧变化(如视图矩阵随相机移动而变化)或保持恒定(如某些情况下的投影矩阵)
- 精度:矩阵元素的精度取决于目标平台和渲染管线设置
在实际使用中,输出矩阵的准确含义和行为取决于所选的控件选项。例如,当选择"Model"选项时,输出的是当前渲染对象的模型矩阵,这个矩阵对于场景中的每个对象可能是不同的。而当选择"View"选项时,输出的是相机的视图矩阵,这个矩阵对于同一相机渲染的所有对象是相同的。
输出端口的连接应用
Transformation Matrix节点的输出端口可以连接到多种不同类型的节点,实现各种图形效果:
- 连接到Position节点的输入,实现自定义的空间变换
- 连接到Calculate Light Direction节点的Matrix输入,实现基于不同空间的光照计算
- 连接到Transform节点的From和To输入,实现自定义的空间转换
- 连接到Matrix Split节点的输入,提取矩阵的特定行、列或元素
- 连接到自定义HLSL函数节点,实现复杂的数学运算
理解输出端口的特性和连接可能性是有效使用Transformation Matrix节点的关键。
控件
Transformation Matrix节点的控件是一个下拉选单,提供了八种不同的变换矩阵选项。这个简单的界面设计隐藏了背后复杂的坐标系统和变换理论,使得即使是对矩阵数学不太熟悉的开发者也能轻松使用这些强大的工具。
| 名称 | 类型 | 选项 | 描述 |
|---|---|---|---|
| 下拉选单 | Model、InverseModel、View、InverseView、Projection、InverseProjection、ViewProjection、InverseViewProjection | 设置输出值 |
控件选项详细解析
每个控件选项对应着Unity渲染管线中一个特定的变换矩阵,理解这些选项的含义和适用场景对于正确使用Transformation Matrix节点至关重要。
Model(模型矩阵)
模型矩阵,通常表示为M,将顶点从局部空间(对象空间)变换到世界空间。局部空间是相对于对象自身原点的坐标系,而世界空间是场景的全局坐标系。
模型矩阵的特点:
- 包含对象的平移、旋转和缩放信息
- 对于场景中的每个渲染对象通常不同
- 在对象的整个生命周期中可能变化(对于动态对象)
- 用于将法线、切线等向量从局部空间转换到世界空间
应用场景:
- 实现对象空间效果,如基于对象位置的纹理映射
- 计算世界空间位置用于光照和阴影
- 创建对象特定的变形效果
InverseModel(逆模型矩阵)
逆模型矩阵,表示为M⁻¹,是模型矩阵的逆矩阵,用于将顶点从世界空间变换回局部空间。
逆模型矩阵的特点:
- 是模型矩阵的逆运算
- 可用于将世界空间向量转换到对象空间
- 计算成本相对较高,应谨慎使用
应用场景:
- 在世界空间中计算但在对象空间中应用的效果
- 将全局信息(如世界空间光方向)转换到对象空间
- 实现相对于对象的位置计算
View(视图矩阵)
视图矩阵,表示为V,将顶点从世界空间变换到视图空间(也称为相机空间)。视图空间是以相机为原点的坐标系,相机的观察方向通常为Z轴负方向。
视图矩阵的特点:
- 由相机的位置和旋转决定
- 对于同一相机渲染的所有对象相同
- 随着相机的移动和旋转而变化
- 用于计算相对于相机的位置和方向
应用场景:
- 实现屏幕空间效果
- 计算视差和深度效果
- 创建基于视图方向的效果
InverseView(逆视图矩阵)
逆视图矩阵,表示为V⁻¹,是视图矩阵的逆矩阵,用于将顶点从视图空间变换回世界空间。
逆视图矩阵的特点:
- 是视图矩阵的逆运算
- 可用于将视图空间向量转换到世界空间
- 在后期处理效果中特别有用
应用场景:
- 重建世界空间位置从深度纹理
- 在视图空间中计算但在世界空间中应用的效果
- 全局光照和反射计算
Projection(投影矩阵)
投影矩阵,表示为P,将顶点从视图空间变换到裁剪空间。裁剪空间是一个齐次坐标空间,用于确定哪些几何体在视锥体内并应该被渲染。
投影矩阵的特点:
- 由相机的投影属性(视野、宽高比、近远裁剪平面)决定
- 对于透视投影和正交投影不同
- 将视图空间坐标转换为齐次裁剪空间坐标
- 负责应用透视变形
应用场景:
- 自定义投影效果
- 非标准相机投影
- VR和AR应用中的特殊投影需求
InverseProjection(逆投影矩阵)
逆投影矩阵,表示为P⁻¹,是投影矩阵的逆矩阵,用于将顶点从裁剪空间变换回视图空间。
逆投影矩阵的特点:
- 是投影矩阵的逆运算
- 可用于将裁剪空间坐标转换回视图空间
- 与内置渲染管线不兼容
应用场景:
- 深度纹理的重建和解析
- 屏幕空间反射和折射
- 后处理效果中的空间转换
ViewProjection(视图投影矩阵)
视图投影矩阵,表示为VP,是视图矩阵和投影矩阵的组合,直接将顶点从世界空间变换到裁剪空间。
视图投影矩阵的特点:
- 是视图矩阵和投影矩阵的乘积:VP = P × V
- 组合了两个变换步骤,提高计算效率
- 常用于顶点着色器中的最终位置计算
应用场景:
- 高效的顶点变换
- 全屏着色器效果
- 阴影和光照计算
InverseViewProjection(逆视图投影矩阵)
逆视图投影矩阵,表示为(VP)⁻¹,是视图投影矩阵的逆矩阵,用于将顶点从裁剪空间变换回世界空间。
逆视图投影矩阵的特点:
- 是视图投影矩阵的逆运算: (VP)⁻¹ = V⁻¹ × P⁻¹
- 组合了两个逆变换
- 与内置渲染管线不兼容
应用场景:
- 从屏幕空间位置重建世界空间位置
- 全局光照计算
- 高级后处理效果
生成的代码示例
理解Transformation Matrix节点生成的代码对于深入掌握其工作原理和进行高级着色器编程至关重要。以下示例代码展示了该节点在每个模式下对应的HLSL代码,这些代码揭示了节点背后的实际实现。
Model模式代码分析
ini
float4x4 _TransformationMatrix_Out = UNITY_MATRIX_M;
在Model模式下,节点输出Unity的内置模型矩阵UNITY_MATRIX_M。这个矩阵将顶点从对象局部空间变换到世界空间。在实际着色器中,这个矩阵通常用于将顶点位置、法线和其他向量从对象空间转换到世界空间。
使用示例:
- 计算世界空间位置:
float3 worldPos = mul(UNITY_MATRIX_M, float4(localPos, 1.0)).xyz; - 转换法线到世界空间:
float3 worldNormal = normalize(mul((float3x3)UNITY_MATRIX_M, localNormal));
InverseModel模式代码分析
ini
float4x4 _TransformationMatrix_Out = UNITY_MATRIX_I_M;
在InverseModel模式下,节点输出模型矩阵的逆矩阵UNITY_MATRIX_I_M。这个矩阵将顶点从世界空间变换回对象局部空间。需要注意的是,计算逆矩阵在性能上比使用原矩阵更昂贵,因此应谨慎使用。
使用示例:
- 将世界空间位置转换到对象空间:
float3 localPos = mul(UNITY_MATRIX_I_M, float4(worldPos, 1.0)).xyz; - 在世界空间效果中保持对象空间特性
View模式代码分析
ini
float4x4 _TransformationMatrix_Out = UNITY_MATRIX_V;
在View模式下,节点输出视图矩阵UNITY_MATRIX_V。这个矩阵将顶点从世界空间变换到视图空间(相机空间)。视图空间以相机为原点,通常相机的观察方向为Z轴负方向。
使用示例:
- 计算视图空间位置:
float3 viewPos = mul(UNITY_MATRIX_V, float4(worldPos, 1.0)).xyz; - 基于视图方向的效果实现
InverseView模式代码分析
ini
float4x4 _TransformationMatrix_Out = UNITY_MATRIX_I_V;
在InverseView模式下,节点输出视图矩阵的逆矩阵UNITY_MATRIX_I_V。这个矩阵将顶点从视图空间变换回世界空间。
使用示例:
- 将视图空间坐标转换回世界空间:
float3 worldPos = mul(UNITY_MATRIX_I_V, float4(viewPos, 1.0)).xyz; - 在视图空间计算中重建世界位置
Projection模式代码分析
ini
float4x4 _TransformationMatrix_Out = UNITY_MATRIX_P;
在Projection模式下,节点输出投影矩阵UNITY_MATRIX_P。这个矩阵将顶点从视图空间变换到裁剪空间。投影矩阵负责应用透视效果,并定义视锥体的范围。
使用示例:
- 计算裁剪空间位置:
float4 clipPos = mul(UNITY_MATRIX_P, float4(viewPos, 1.0)); - 自定义投影效果实现
InverseProjection模式代码分析
ini
float4x4 _TransformationMatrix_Out = UNITY_MATRIX_I_P;
在InverseProjection模式下,节点输出投影矩阵的逆矩阵UNITY_MATRIX_I_P。这个矩阵将顶点从裁剪空间变换回视图空间。需要注意的是,此选项与内置渲染管线不兼容。
使用示例:
- 从深度纹理重建视图空间位置
- 屏幕空间反射和折射效果
ViewProjection模式代码分析
ini
float4x4 _TransformationMatrix_Out = UNITY_MATRIX_VP;
在ViewProjection模式下,节点输出视图投影矩阵UNITY_MATRIX_VP。这个矩阵是视图矩阵和投影矩阵的组合,直接将顶点从世界空间变换到裁剪空间。
使用示例:
- 高效计算裁剪空间位置:
float4 clipPos = mul(UNITY_MATRIX_VP, float4(worldPos, 1.0)); - 全屏后处理效果
InverseViewProjection模式代码分析
ini
float4x4 _TransformationMatrix_Out = UNITY_MATRIX_I_VP;
在InverseViewProjection模式下,节点输出视图投影矩阵的逆矩阵UNITY_MATRIX_I_VP。这个矩阵将顶点从裁剪空间变换回世界空间。此选项也与内置渲染管线不兼容。
使用示例:
- 从屏幕空间坐标重建世界空间位置
- 全局光照和体积效果
实际应用案例
为了更深入地理解Transformation Matrix节点的使用方法,以下提供几个实际应用案例,展示如何在不同场景中利用各种变换矩阵。
案例一:基于对象空间的动态变形
在这个案例中,我们将使用模型矩阵创建基于对象空间的动态变形效果。这种效果可以用于创建摇摆的植物、波动的旗帜或自定义的顶点动画。
实现步骤:
- 使用Transformation Matrix节点选择Model模式,获取模型矩阵
- 将模型矩阵连接到Transform节点,将世界空间向量转换到对象空间
- 在对象空间中计算变形偏移
- 使用逆模型矩阵将变形后的位置转换回世界空间
- 应用最终的世界空间位置
这种方法的优势在于变形效果相对于对象自身,无论对象在场景中如何移动或旋转,变形效果都会保持一致性。
案例二:屏幕空间反射效果
屏幕空间反射(SSR)是一种常见的高级渲染技术,它使用逆视图投影矩阵从屏幕空间信息重建世界空间位置,从而计算精确的反射效果。
实现步骤:
- 使用Transformation Matrix节点选择InverseViewProjection模式
- 结合深度纹理和屏幕UV坐标重建世界空间位置
- 计算反射向量和反射交点
- 在屏幕空间中采样反射颜色
- 将反射颜色与表面颜色混合
这种方法能够创建高质量的真实感反射效果,但需要注意性能影响和边缘情况处理。
案例三:自定义投影系统
在某些特殊应用中,如VR、AR或特殊镜头效果,可能需要自定义投影系统。使用投影矩阵和逆投影矩阵可以实现非标准的投影效果。
实现步骤:
- 使用Transformation Matrix节点选择Projection模式获取标准投影矩阵
- 修改投影矩阵以实现所需的投影效果(如鱼眼、圆柱投影)
- 在着色器中应用自定义投影矩阵
- 使用逆投影矩阵进行相应的空间转换
这种方法允许开发者突破标准透视投影的限制,创建独特的视觉体验。
性能考虑和最佳实践
虽然Transformation Matrix节点提供了方便的矩阵访问方式,但在实际使用中需要考虑性能影响和最佳实践。
性能考虑
- 矩阵乘法在着色器中是相对昂贵的操作,应尽量减少不必要的矩阵变换
- 逆矩阵的计算和使用比原矩阵更昂贵,应谨慎使用
- 在可能的情况下,优先使用预计算的组合矩阵(如ViewProjection)而不是分别应用多个矩阵
- 对于静态对象,考虑在CPU端预计算变换结果
最佳实践
- 在顶点着色器中进行空间变换,而不是在片元着色器中
- 尽可能使用最少的变换步骤达到所需效果
- 对于不需要精确矩阵的情况,考虑使用简化计算或近似方法
- 在不同渲染管线中测试兼容性,特别是使用InverseProjection和InverseViewProjection时
【Unity Shader Graph 使用与特效实现】专栏-直达 (欢迎点赞留言探讨,更多人加入进来能更加完善这个探索的过程,🙏)