🚙

[Bevy] WGSLシェーダーをインポートする方法

に公開

bevyのwgslシェーダーをインポートする際は

main_shader.wgsl
#import bevy_pbr::pbr_fragment::pbr_input_from_standard_material;

でインポートできます。

もし自分で作成したモジュールをインポートしたい場合は

  1. アセットとして登録して
  2. #define_import_pathでパスを定義して
  3. #import my_moduleでインポートします

1. モジュール用のプラグインを作成

utils.rs
use bevy::{
    asset::{embedded_asset, load_internal_asset, weak_handle},
    prelude::*,
};

pub const MY_MODULE : Handle<Shader> = weak_handle!("generated_uuid"); // get it from https://www.uuidgenerator.net/version4

pub struct MyModulePlugin;
impl Plugin for MyModulePlugin {
    fn build(&self, app: &mut App) {
        load_internal_asset!(app, MY_MODULE, "../assets/shaders/my_module.wgsl", Shader::from_wgsl);
    }
}

このプラグインをmain.rsに追加してアセットとして使える状態にします。

main.rs
use bevy::prelude::*;
mod utils;
use utils::MyModulePlugin;

fn main(){
    App::new()
        .add_plugins((
            DefaultPlugins, 
            MyModulePlugin,
        )).run();
}

2. パスを定義する

my_module.wgsl
#define_import_path my_module

fn my_func -> f32 {
    return 1.0;
}

3. インポートする

main_shader.wgsl
#import bevy_pbr::forward_io::{VertexOutput, Vertex};
#import my_module

@vertex
fn vertex(vertex:Vertex) - VertexOutput {
    let x = my_module::my_func(); // こんな感じで使えます
    ...
}

ここまででディレクトリ構造は以下のようになってます。

src
    |- main.rs
    |- utils.rs
assets
    |- shaders
        |- main_shader.wgsl
        |- my_module.wgsl

参考リンク

bevy_shader_utils
naga-oil

Discussion