#bevy #shader #graphics #game-engine #gamedev

已撤销 bevy_blackout

为Bevy游戏引擎添加第三人称可见性投射的插件

1 个不稳定版本

0.1.0 2023年12月12日

#1075图形API

MIT/Apache

785KB
77

bevy_blackout

bevy_blackout 是我为制作一款游戏添加的一个小着色器调整,但出人意料的是它非常模块化,所以我决定将其作为一个工具箱发布。想法是我想丢弃所有对第三人称角色不可见的片段。这是通过在角色的眼睛点放置一个带阴影投射的点光源来建模的,然后丢弃从这个光源的角度最终落在“阴影”中的所有片段。该效果支持多个“眼睛点”,在这种情况下,只有当没有光线可以看到它们时才会丢弃片段。这允许你,例如,在场景中有多个角色,并显示他们中的任何一个可以看到的片段。

为了防止效果干扰到你的其他灯光,将灯光变成可见性标记的秘密代码是将它的颜色设置为黑色。这确保标记不会影响光照,因为其颜色在任何距离上总是黑色,并且你的其他灯光也不会被错误地视为可见性标记。只有具有 BlackoutMaterial 的对象会受到可见性裁剪的影响。我还建议启用背面裁剪,否则当网格位于相机和可见性标记之间时,你会看到很多背面。请注意,这默认对 StandardMaterial 启用,但如果您从 .gltf/.glb 等示例加载网格,裁剪可能自动启用或禁用。

使用方法

BlackoutPlugin 添加到您的 App

use bevy_blackout::BlackoutPlugin;
...
app.add_plugins(BlackoutPlugin);

将材质添加到应该被遮挡的场景对象

use bevy_blackout::BlackoutMaterial;

fn setup(
    mut blackout_materials: ResMut<Assets<BlackoutMaterial>>,
    mut commands: Commands,
) {
    ...
    let player = commands.spawn(MaterialMeshBundle {
        mesh,
        material: blackout_materials.add(BlackoutMaterial {
            base: StandardMaterial {
                // Backface culling is not *necessary* but likely what you want
                cull_mode: Some(Face::Back),
                ..default()
            },
            extension: default(),
        }),
        ..default()
    }).id();
}

添加一个可见性标记,它只是一个颜色为黑色的 PointLight

let viz_marker = commands.spawn(PointLightBundle {
    point_light: PointLight {
        color: Color::BLACK, // This light is a marker
        range: 20.0, // Most light parameters work like you'd expect
        shadows_enabled: true, // Must cast shadows or effect won't work
        ..default()
    },
    transform: Transform::from_xyz(0.0, 0.5, 0.0), // Player eye point
    ..default()
}).id();
// Add the marker to player so visibility moves around with it
commands.entity(player).add_child(viz_marker);

完成

Demo of third-person visibility occlusion

(此场景的完整代码是 simple 示例)

请注意,您可能还需要为您的材质启用背面剔除,否则相机和角色之间的对象将丢弃其正面,相机将被迫凝视您的网格的倒影。

局限性

  • 目前仅适用于 StandardMaterial。这是一个非常简单的效果,您可以简单地复制相关行到自定义着色器中。一个更持久的解决方案是Bevy的核心管道增加某种着色器管道,让您在不同的阶段扩展它,例如在输入材质参数和光照计算之间插入自定义WGSL。
  • 根据您角色的几何形状,角色正下方的场景部分可能被遮挡(例如,角色无法看到自己的手臂)。在未来,Bevy可能会允许我们排除角色在特定灯光下的阴影贴图。目前,解决方案是完全禁用角色的阴影投射。
  • 目前仅适用于点光源。我希望看到这种效果在聚光灯上,因为聚光灯可以用来“照亮”单方向的可见性,而不是在所有方向上“辐射”它。我会在未来某个时候添加这个功能(如果现在您看到这篇文章,并且最后的提交已经超过1年,并且仍未添加,对此表示歉意)。
  • 定制化有限。目前,当三角形与可见性投射器成 grazing 角度时,会出现丑陋的伪影,所以我添加了一个阈值来自动剔除 grazing 角度的三角形。在未来,这些(以及可能的其他参数)将是可调整的。

示例

简单

可见性投射器连接到玩家。使用 WASD 移动角色。

Bevy 版本

bevy bevy_blackout
0.12 0.1

贡献

欢迎提交PR。说实话,我不认为这个功能会有什么进展,除非Bevy有一个更健壮的渲染引擎,但如果您看到需要或有愿望列表功能,请随时实现它。

依赖项

~44–78MB
~1M SLoC