高清渲染管线 (High Definition Render Pipeline) 中的折射
高清渲染管线 (HDRP) 使用折射算法来模拟材质中的光偏差和吸收。为了加快计算速度,HDRP 采用以下关于光传播路径的假设:
- 光首先穿过空气,然后穿过材质,然后再穿过空气。这意味着该算法计算材质两个界面处的光偏差:空气到材质,材质到空气。
- 一个简单的形状即可模拟对象的表面。此形状是在折射模型中定义的。
HDRP 使用折射模型来确定偏光方向以及光在材质内传播的距离。然后,HDRP 针对探针代理体进行光线投射(代理光线投射 (Proxy Raycasting))来找到折射光线的命中点。
使用折射
要设置材质上的折射,需要执行以下操作:
- 单击所需材质以在 Inspector 中打开该材质。
- 单击 Surface Type 下拉选单,然后选择 Transparent。此时会在 Inspector 中显示 Transparency Inputs 部分。
- 单击 Refraction Model 下拉选单以选择材质的折射模型。
- 确保 Base Map 的 Alpha 值小于 1 以使材质折射。值为 0 表示材质是完全折射的。
有关用于控制折射的属性的更多信息,请参阅表面类型 (Surface Type)。
注意,从直观上讲,折射对象的材质越不光滑,折射就越模糊。
如果要有效使用屏幕空间折射,则还需要设置探针代理体。这是因为屏幕空间折射使用探针代理体来模拟场景并找到正确的折射颜色。为了获得最佳效果,代理体应尽可能接近于希望折射光线着陆的场景。有关代理体的更多信息,请参阅反射代理体积 (Reflection Proxy Volume) 页面。
折射计算
HDRP 使用以下技术来计算光折射:
为了帮助您确定在 Unity 项目中使用哪些技术,下表显示了每种技术的资源消耗强度。
技术 | 描述 | 运行时的资源消耗强度 |
---|---|---|
屏幕空间折射 | 用于实时捕获所有游戏对象的屏幕空间解决方案。 | 低。 |
烘焙反射探针 | 手动放置的局部反射探针,仅在烘焙过程中捕获静态游戏对象。 | 低。 |
实时反射探针 | 手动放置的局部反射探针,用于实时捕获所有游戏对象。 | 中高(这取决于游戏对象捕获的分辨率)。 |
折射层级视图 (Refraction hierarchy)
为了产生最高质量的折射,HDRP 会选择能够为每个像素提供最佳精度的折射技术,并使用这种技术来计算折射,同时确保这种技术与所有其他技术融合。
要此,HDRP 将按特定顺序(称为折射层级视图)检查可用技术。折射层级视图的顺序是:
这意味着,如果屏幕空间折射不返回像素的信息,则 HDRP 对该像素使用反射探针。
屏幕空间折射
折射层级视图的第一层是屏幕空间解决方案。为了计算屏幕空间折射,算法会追踪从折射对象开始的光线。然后将根据材质的特性折射光线。要计算折射光线,算法假设折射对象可以近似为一个简单的形状(折射模型)。
然后,折射光线将与代理体相交,从而在屏幕空间中找到最近似折射光线结果的适当像素。
反射探针
折射层级视图的第二级使用反射探针。当屏幕空间折射无法为像素生成有用的折射数据时,可能是因为它反射的区域在屏幕外,所以 HDRP 使用反射探针。 反射探针从它们的视角捕获场景并将结果存储为纹理。探针范围内的折射材质可以查询该探针的纹理,然后将其用于模拟精确的折射。
与屏幕空间折射不同,您必须手动设置反射探针。
有关反射探针的更多信息,请参阅:
折射模型
HDRP 使用简单的形状来模拟游戏对象的表面:
- 球体 (Sphere):将表面近似为球体。
- 盒体 (Box):将表面近似为空心盒体。在这种情况下,可将厚度视为盒体两个平行面之间的距离。
- Thin:将表面近似为固定厚度为 5cm 的盒体。
示例
对于实心的游戏对象,请使用球体折射模型,其厚度大约等于使用材质的游戏对象的大小。要设置厚度,请使用 Refraction Thickness 设置。
对于空心的折射游戏对象(例如,气泡),请使用厚度值较小的盒体折射模型。要设置厚度,请使用 Refraction Thickness 设置。