雅各比矩阵

以下是为您设计的虚幻引擎焦散材质方案,其核心思路是利用表面法线扰动计算光线折射路径的微小变化,并用雅可比矩阵的行列式表示光线能量密度的变化。这个方案只需一次法线贴图采样,计算开销较低。

核心算法原理

1. 物理基础:光线折射与焦散形成

  • 焦散成因:当平行光线穿过凹凸不平的玻璃表面时,折射光线的汇聚/发散形成明暗图案
  • 斯涅尔定律
  • 关键变换:表面法线扰动 折射方向变化 焦平面上光线位置偏移

2. 雅可比矩阵的作用

雅可比矩阵在这里描述 "光线偏移量对表面位置的局部敏感性"

其中 是焦平面上的光线偏移量, 是表面参数坐标

几何含义:
  • :局部区域内光线面积的缩放因子
  • 光线密度
  • :光线发散(变暗),:光线汇聚(变亮)

3. 实时计算优化策略

物理量 近似计算 目的
折射方向 切线空间直接计算(避免坐标系转换) 减少运算量
雅可比行列式 屏幕空间梯度 (ddx/ddy) 避免解析求导,单次采样
能量守恒 $\text{intensity} = 1.0 / \max( \det(J)

虚幻引擎材质蓝图

// 在Material Function "CausticCore" 内的 HLSL 代码
void CausticCore(
    float3 NormalTS,    // 切线空间法线
    float IOR,          // 折射率 (1.0-2.0)
    float Distance,     // 到焦平面的距离 (单位:米)
    out float2 Offset,  // 焦平面上的UV偏移
    out float Intensity // 焦散强度 (0.0-10.0)
)
{
    // Step 1: 计算折射方向 (切线空间)
    float3 LightDir = float3(0, 0, 1); // 垂直入射光
    float eta = 1.0 / IOR;
    float3 RefractedDir = refract(LightDir, NormalTS, eta);

    // Step 2: 计算焦平面偏移量
    float z = RefractedDir.z;
    if (abs(z) < 0.001) z = 0.001; // 避免除零
    Offset = -Distance * RefractedDir.xy / z;

    // Step 3: 计算雅可比行列式 (屏幕空间)
    float2 dOffsetdx = ddx(Offset);
    float2 dOffsetdy = ddy(Offset);
    float detJ = dOffsetdx.x * dOffsetdy.y - dOffsetdx.y * dOffsetdy.x;

    // Step 4: 计算能量密度
    float energy = 1.0 / max(abs(detJ), 0.001);
    float focus = saturate(dot(NormalTS, LightDir)); // 法线影响因子
    Intensity = energy * focus * 0.1; // 缩放强度
}

材质节点图配置

[法线贴图采样] --> [切线空间法线]
                      ↓
[参数输入] -IOR-> [CausticCore]-->[Offset]-->[焦散贴图UV偏移]
          -Distance->      ↓ 
                   [Intensity]-->(*)--->[最终颜色]
                          ↑
[焦散贴图采样]------------+

参数说明:

  • 法线贴图:控制表面凹凸细节
  • IOR:折射率(玻璃 ≈1.5,水≈1.33)
  • Distance:到焦平面的距离(典型值0.5-2米)
  • 焦散贴图:用于采样的基础光斑纹理(可选用菱形或环形图案)

性能优化关键

  1. 单次采样:仅需1次法线贴图采样
  2. 无循环/分支:纯数学计算,GPU友好
  3. 近似计算
    • 采用切线空间计算省去坐标系转换
    • ddx/ddy代替解析偏导数
  4. 物理约束
    • saturate()限幅防止数值溢出
    • 法线点积增强物理合理性

💡 实时演示效果:当表面凹凸剧烈时,det(J)变化剧烈,形成明亮的焦散图案;平坦区域则呈现均匀光照

应用场景

玻璃表面

折射方向计算

焦平面偏移量

Jacobian行列式

光线密度图

焦散光斑

这种基于雅可比矩阵的解法在计算开销和物理精确度间取得了平衡,非常适合实时渲染需求。实践中可通过调整距离参数控制焦散图案的锐利度。