【UE】 实现指向性菲涅尔 常用于圆柱体的特殊菲涅尔
菲涅尔
菲涅尔Fresnel
是一种常见的视觉效果
其核心思想是利用屏幕观测方向与表面法线之间的夹角来动态调整材质的表现。例如,物体表面在与摄像机方向接近平行时,反射或高光的强度会增强,这是菲涅尔效应的基本特性。
菲涅尔的基本实现
菲涅尔算法本质上非常简单,只需通过 表面法线Normal
与 摄像机方向Camera Vector
的点积计算夹角余弦值,得到一个动态的比例值。
公式如下:
F=1−∣N⋅V∣ F = 1 - \lvert \mathbf{N} \cdot \mathbf{V} \rvert F=1−∣N⋅V∣
其中:
- NNN:表面法线(世界空间)
- VVV:摄像机方向
- FFF:菲涅尔值,范围在 [0, 1]。
这种菲涅尔效果在大多数情况下都表现优秀,但对于某些特定的几何体(例如圆柱体、锥体等),可能无法满足所有需求。
指向性菲涅尔
在观察圆柱体时,默认的菲涅尔计算会出现以下问题:当视线方向沿着圆柱的轴线时,菲涅尔值会趋近于零,导致物体的高光或透明效果完全消失。这种现象在某些特效(如激光、假体积光)中会显得不够自然或违背设计需求。
为了方便预览,这里使用Frac
对倍数的结果进行取余,观察菲涅尔的梯度
为了避免这种问题,需要设计一种指向性菲涅尔
,使其能够在圆柱轴线方向观察时仍然保留一定的菲涅尔效果。
应用场景
如能量束、光柱等需要稳定菲涅尔效果的特效,需要实现一些特殊需求。
例如在激光材质中,需要使用指向性菲涅尔避免因视角问题导致光效消失。
对比
指向性菲涅尔的核心是对视线方向做一个动态调整,使其与圆柱的轴线方向正交,从而避免在圆柱轴向观察时出现菲涅尔值完全消失的问题。
左侧为指向性菲涅尔
它看上去像这样
左侧为指向性菲涅尔,右侧为常规菲涅尔
算法
首先通过顶点法线(Normal)与顶点切线(Tangent)的叉积计算得到轴向,计算得到的轴线方向需要归一化处理,以确保其为单位向量。
将计算得到的轴线方向用于修正视线方向。
首先,利用点积计算视线方向在轴线方向上的投影
然后,将投影分量从视线方向中减去,得到一个与圆柱轴线正交的视线归一化方向:
将修正后的视线方向与像素法线(Pixel Normal)进行点积,得到最终的菲涅尔值
最后再制作一个左右分屏做对比
在对比测试中,指向性菲涅尔相比于默认菲涅尔,在圆柱体的轴向观察时保留了合理的梯度效果
用于圆锥也有很多用处,例如假体积光等。