反射光(Bounced Light)
整个过程可能有点复杂,如果这篇文章不太清楚敬请谅解。如果有任何问题或改进建议,请联系开发者。
基础知识
反射光是 Extra FX 的一部分,为水平被照亮的表面附近的墙壁或天花板添加额外的光照。以下是效果展示:
反射光的优点是整个过程只花费大约 0.3 毫秒,它不是屏幕空间效果(即使被照亮的道路不在画面中也能工作),没有时间滞后,因此对任何光照变化立即反应。但是,有一些缺点,因此需要赛道配置才能工作。
工作原理
原理极其简单:从上方拍摄赛道周围的快照,模糊它,然后使用它添加反射光。稍微复杂的是,在应用阶段,它还会比较点到下方表面的距离。更大的差异意味着更多模糊和更低的强度:
因此第一个缺点是:要使隧道和立交桥正常工作,光照贴图应只包含你期望反射回光线的表面。以 Black Cat County 为例(前两张截图),岩石不应该出现在光照贴图中,否则整体看起来会非常不对。注意光照贴图不包含岩石,但有岩石的阴影:
第二个缺点性质类似:整个系统主要适用于单层赛道。我认为这就是为什么没有其他游戏真正使用这个技巧的原因,一旦你遇到两层楼的建筑,整个系统就崩溃了。幸运的是,AC 中 98% 的赛道是平坦的,所以效果很好。还有一些额外选项可能有助于处理一些更复杂的情况,但目前还远非完美。
语法
对于任何 …_MATERIALS,也有对应的 …_MESHES(如 SURFACE_MESHES),两者可以同时使用。
[BOUNCED_LIGHT]
SUPPORTED = 1 ; 简单设置,表示赛道支持反射光
SURFACE_MATERIALS = ? ; 反射光的材质列表,默认值为 1
OBJECT_MATERIALS = ; 对象列表:它们从光照贴图中完全排除,在这里添加广告牌、标志、墙壁、栏杆等不是反射光的平坦表面
SPOT_MATERIALS = ; 会贡献反射光但不改变表面高度的对象列表。例如在 Black Cat County,岩石列在这里,所以它们会反射光线但不会影响地面高度
OCCLUDING_MATERIALS = ; 将被绘制为黑色的对象列表,从而在地面上投射阴影
CLIP_POINT_... = 192, 79, 494 ; 裁剪点列表(稍后详细介绍)
CLIP_POINT_... = -197, 3, -776 ; 请记住,在 CSP 中,你可以使用 "..." 作为键,索引将自动设置
CLIP_POINT_... = ...什么是裁剪点?这是一种将天花板与其他所有内容分离的简单方法。再看看 Black Cat County 上的那些岩石。它是一整块网格。虽然我可能希望其下部贡献反射光,但上部当然应该被排除。这种情况比比皆是:例如,你可能想要去掉隧道上方的山丘,它使用与附近某处一堆地形相同的网格名称和材质。这就是裁剪点发挥作用的地方。
想象一个在 500 米高度处的平面。每个裁剪点将其向下拉,使其到达该点然后返回:
你可以在 Extra FX Debug 应用的 Bounced Light 选项中开启该调试视图。
这是一个有点奇怪的系统,但我发现它在简单通道和长隧道中都运行良好,而且与着色器配合良好(注意着色器可能只使用 16 个最近的点,但似乎足够了)。裁剪点不仅可以向下拉平面,当然也可以向上移动。此外,如果需要,每个裁剪点可以有自己的权重修改其"引力"。
要添加裁剪点,我建议只需将摄像机移动到它应该在的位置,复制其坐标并粘贴到赛道配置中作为新的 CLIP_POINT_... 行。
要更改裁剪点的权重,只需添加第四个值。默认权重为 1。还记得我前面提到的 500 米吗?那也可以更改:
[BOUNCED_LIGHT]
CLIP_BASE_WEIGHT = 1 ; 裁剪平面的起始权重,增加使裁剪点更难拉动
CLIP_BASE_Y = 500这就是基本设置的全部内容!希望这些对你有帮助。还有一个重要提示:请确保将任何不贡献反射光的内容添加到 OBJECT_MATERIALS,这可能会在渲染光照贴图时节省大量时间。
焦散效果(Caustics)
要激活焦散效果,使用:
[BOUNCED_LIGHT]
CAUSTICS = 1
CAUSTICS_SCALE = 1 ; 可选,调整焦散强度额外裁剪平面
作为多层赛道(有桥梁等)的一种临时解决方案,目前有一种可能的方案:定义一个具有新裁剪点的新裁剪平面,在空间上有限。如果摄像机最终低于该平面,将添加额外的裁剪点。以下是一个示例,假设我想让纽博格林北环赛道的这条隧道在天花板上获得良好的反射光,同时不破坏其上方一切的反射光。
为此,我可以像这样定义一个新的裁剪平面:
[BOUNCED_LIGHT_ADJUSTMENT_...]
CENTER = -441.05, -141.52, -1993.56 ; 新裁剪平面的中心
RADIUS = 200 ; 其半径,用于在摄像机太远时丢弃以节省性能,并减少不必要的触发
CLIP_BASE_Y = -200 ; 基准 Y 值
CLIP_POINT_... = -440.49, -145.23, -1996.67 ; 定义平面的点:桥下方的一个
CLIP_POINT_... = -468.28, -136.91, -2005.69 ; 左侧上方的一个,获得凸起
CLIP_POINT_... = -416.11, -135.55, -1975.77 ; 右侧上方的一个,获得凸起
CLIP_POINT_... = -418.04, -149.52, -2037.85 ; 桥后的一个,将平面推到道路下方
CLIP_POINT_... = -452.52, -142.24, -1974.21 ; 桥前的一个,将平面推到道路下方一旦摄像机移动到该平面以下,其点将应用于主裁剪平面,导致反射光改变:
这个技巧远非理想,但我认为通常可能效果不错,例如对于绑定到汽车的摄像机,汽车要么在桥上方要么在桥下方移动。此外,这种跳跃可能在以后被平滑处理。
高度图
为了使整体看起来更好,它需要知道任何给定点到表面的距离。现在,想象表面有洞,或者你忘记将某辆停放的汽车标记为对象网格,它被视为影响反射光的主要凸起。为了尝试解决此问题,Custom Shaders Patch 扩展了深度图:基本上,对于每个像素,它会在一定半径内检查所有邻居并选择较低但非零的值(以处理孔洞)。但在某些情况下,这可能会降低陡峭表面上反射光的质量。以下是如何更改该行为:
[BOUNCED_LIGHT]
DEPTH_EXPANSION_STEPS = 1 ; 默认值为 1增加步数以增加一些额外复杂情况下的检查半径(不推荐)。或者,如果你知道光照贴图没有孔洞和陡峭跳跃(Extra FX Debug 应用中有选项检查检测到的表面距离),将其设为 0 可以稍微提高性能和质量。
引用来源
- CSP 官方 Wiki 原文 — 内容来源
- acc-extension-config 仓库 — CSP 官方配置文件
- INIpp 配置语法 — 配置格式参考