1 个不稳定版本
0.1.0 | 2023年12月12日 |
---|
#1075 在 图形API 中
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);
完成
(此场景的完整代码是 simple
示例)
请注意,您可能还需要为您的材质启用背面剔除,否则相机和角色之间的对象将丢弃其正面,相机将被迫凝视您的网格的倒影。
局限性
- 目前仅适用于
StandardMaterial
。这是一个非常简单的效果,您可以简单地复制相关行到自定义着色器中。一个更持久的解决方案是Bevy的核心管道增加某种着色器管道,让您在不同的阶段扩展它,例如在输入材质参数和光照计算之间插入自定义WGSL。 - 根据您角色的几何形状,角色正下方的场景部分可能被遮挡(例如,角色无法看到自己的手臂)。在未来,Bevy可能会允许我们排除角色在特定灯光下的阴影贴图。目前,解决方案是完全禁用角色的阴影投射。
- 目前仅适用于点光源。我希望看到这种效果在聚光灯上,因为聚光灯可以用来“照亮”单方向的可见性,而不是在所有方向上“辐射”它。我会在未来某个时候添加这个功能(如果现在您看到这篇文章,并且最后的提交已经超过1年,并且仍未添加,对此表示歉意)。
- 定制化有限。目前,当三角形与可见性投射器成 grazing 角度时,会出现丑陋的伪影,所以我添加了一个阈值来自动剔除 grazing 角度的三角形。在未来,这些(以及可能的其他参数)将是可调整的。
示例
简单
可见性投射器连接到玩家。使用 WASD 移动角色。
Bevy 版本
bevy | bevy_blackout |
---|---|
0.12 | 0.1 |
贡献
欢迎提交PR。说实话,我不认为这个功能会有什么进展,除非Bevy有一个更健壮的渲染引擎,但如果您看到需要或有愿望列表功能,请随时实现它。
依赖项
~44–78MB
~1M SLoC