#bevy #graphics #gamedev #skybox

bevy_skybox_cubemap

Bevy引擎的基于立方体贴图的Skybox

1 个不稳定版本

0.1.0 2021年9月29日

#922 in 游戏开发

Apache-2.0

71KB
283

Crates.io Docs.rs Workflow Status Maintenance

Bevy Skybox Cubemap

为Bevy提供基于立方体贴图的Skybox。

概述

此crate提供了一个材质类型,SkyboxMaterial,和包,SkyboxBundle,这使得将Skybox添加到场景中变得容易。Skybox是通过使用特殊着色器实现的普通实体,以确保它们始终出现在相机周围并在场景中所有其他对象之后。

基本用法

// Install the skybox plugin:
App::build()
    .add_plugins(DefaultPlugins)
    .add_plugin(SkyboxPlugin)
    .add_startup_system(setup.system());

// Configure the skybox.
fn setup(
   mut commands: Commands,
   asset_server: Res<AssetServer>,
   mut skyboxes: ResMut<Assets<SkyboxMaterial>>,
   mut skybox_conversion: ResMut<SkyboxTextureConversion>,
) {
    // Load a texture to use as the skybox.
    let skybox_texture = asset_server.load("labeled_skybox.png");
    // Convert a flat image the 6 faces above one another into a 6-layer array texture that's
    // appropriate for skybox use.
    skybox_conversion.make_array(skybox_texture.clone());
    // Spawn a skybox entity.
    commands.spawn_bundle(SkyboxBundle::new(
        skyboxes.add(SkyboxMaterial::from_texture(skybox_texture)),
    ));
}

下面详细说明了所需的纹理格式。

Skybox几乎可以说是普通实体。正常的Bevy特性,如渲染层和渲染通道选择,应适用于它们,因此可以使用渲染层在不同的相机中使用不同的Skybox。

Skybox几乎完全在着色器代码中实现,因此除了最初的纹理转换(如果您愿意,您可以自己完成)之外,不需要额外的相机或标记组件,或对相机或Skybox的复杂变换设置。着色器将确保Skybox始终绘制在所有其他实体之后,并且相机和Skybox的位置都没有影响。

如果您希望您的Skybox具有不同的方向,则Skybox变换的旋转组件确实被尊重。

纹理布局

为了使用Skybox,您需要一个格式正确的Skybox纹理。适用于SkyboxMaterial的适当纹理应包含6个大小相同的正方形层,这些层构成了Skybox的6个面。提供了一个辅助器,可以将单个层的N x 6N图像转换为适合Skybox的6层图像。

这是基于立方体贴图面方向的基础。它不是实际用于渲染的纹理布局。

顶部 (+Y)
左侧 (-X) 前方 (-Z) 右侧 (+X) 后方 (+Z)
底部 (-Y)

对于渲染,面按以下顺序用作数组纹理的单独层

  • 右侧 (+X)
  • 左侧 (-X)
  • 顶部 (+Y)
  • 底部 (-Y)
  • 后方 (+Z)
  • 前方 (-Z)

目前创建具有适当层级的图像最简单的方法是将立方体网格的各个部分按照所需顺序重新排列成单个垂直图像,然后加载图像时,将其发送到 SkyboxTextureConversion,它将使用 Texture::reinterpret_stacked_2d_as_array 将其转换为加载后的6层数组。

以下是重新排列成适用于天空盒纹理的正确顺序的上述网格。

在将网格或表示天空盒面的图像集合转换为图像时,请注意它们相对于上面提到的标准网格的朝向。如果你有一个网格,其顶面和底面连接到第三个而不是第二个正方形,那么在将面重新排列成垂直数组格式时,最简单的方法就是将匹配顶面和底面的任何面解释为“前面”。

例如,如果顶面和底面从第三个正方形分支出来而不是第二个,你可以这样解释网格:

然后,你会从这个网格重新排列成上面提到的相同的垂直布局。

或者,如果你想将特定的面用作“前面”,而这个面并不与顶面和底面的朝向匹配,你可以在构建堆叠数组纹理时旋转顶面和底面。然而,由于你也可以使用天空盒实体的变换来旋转天空盒,这可能并不必要。

此组件的维护

Bevy是一个很酷的项目,我很期待它取得成功。然而,我并不一定总有时间将这个组件与Bevy的最新版本保持同步,尤其是如果它的使用相对较少。

话虽如此,我 回应pull requests,并将基于pull requests发布新版本,以更新到Bevy的新版本。创建pull request比打开一个要求我更新的issue更好,因为我更容易抽出时间来合并pull request,而不是自己进行所有必要的更新。但是,如果我收到要求更新到Bevy新版本的issue,我将尽力回应。

我将创建针对Bevy最新发布版本的发布,而不是 main。如果你正在使用main,并且需要修改此组件以与最新的 HEAD 一起使用,我建议进行fork,然后在Bevy发布更新版本后向我发送pull request。

在功能方面,我认为这个项目已经基本上完成了。纹理包装似乎超出了Bevy支持的功能范围,所以我不会添加工具来自动构建天空盒的纹理。这个组件也不打算支持任何类型的动态天空盒,因此除了保持与Bevy最新版本的同步外,似乎没有太多需要做的事情。然而,如果你有任何关于新功能或API更改的想法,我很乐意听听。

免责声明

这不是一个官方支持的Google产品。

许可证:Apache-2.0

依赖关系

~29–72MB
~586K SLoC