bevy-rendering について
bevy-renderingは、Bevy 0.19のレンダリング構成を選び、拡張するためのスキルです。組み込み、遅延、ヘッドレス、外部レンダラーの選択肢と統合上の注意点を整理します。
主な機能
- 01レンダラープロファイルの選択
- 02フォワードと遅延レンダリングの比較
- 03組み込みレンダリングの拡張
- 04ヘッドレス・外部レンダリングの計画
- 05Rapierとの境界の把握
- 06Cargo機能設定の監査
活用シーン
- 01ゲームや可視化向けのレンダラー選定
- 02カスタムシェーダーや描画パスの追加
- 03ヘッドレスシミュレーションの設定
- 04レンダリングとRapierの機能構成確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ chrisgliddon/ bevy-skills --skill bevy-renderingインストール後、Claude Code で/bevy-renderingを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/physics-boundary.mdrender-systems.mdrenderer-choice.mdscripts/audit_renderer_features.pytests/test_audit_renderer_features.py詳細
Bevy 0.19 — レンダリングの選択肢
計測によって制約が確認され、カスタムの方法が必要と判断されるまでは、Bevy 組み込みの wgpu レンダラーを使用してください。レンダラーの置き換えによって変わるのは、プラグインだけではありません。アセットの準備、可視性、カメラ、マテリアル、プラットフォームとの統合、デバッグにも影響します。
まず必要なものを分類する
| 必要なもの | 方法 |
|---|---|
| 一般的な 2D/3D ゲーム、エディター、可視化 | 組み込みの 2d / 3d プロファイル |
| カスタムシェーダーまたは特殊なパス | 組み込みレンダリングを拡張 |
| デスクトップクラスの GPU で多数の動的ライトを使用 | 不透明オブジェクトのディファードレンダリングを検討 |
| ピクセルを出力しないサーバーシミュレーション | ヘッドレスの MinimalPlugins プロファイル |
| 既存のプロプライエタリ/組み込みレンダラー | 2d_api / 3d_api と明示的なブリッジ |
| 物理演算、衝突判定、キャラクターの移動 | bevy-physics。これはレンダラーを選択しません |
物理演算クレートがあるという理由だけで、レンダラーを置き換えないでください。
bevy_rapier3d は剛体シミュレーションとクエリを計算します。オプションのデバッグ描画には Bevy のレンダリングを使用しますが、Rapier はレンダラーではありません。
組み込みレンダラー
[dependencies]
bevy = { version = "0.19", default-features = false, features = ["3d", "ui"] }
use bevy::prelude::*;
fn main() {
App::new()
.add_plugins(DefaultPlugins)
.add_systems(Startup, setup)
.run();
}
fn setup(
mut commands: Commands,
mut meshes: ResMut<Assets<Mesh>>,
mut materials: ResMut<Assets<StandardMaterial>>,
) {
commands.spawn((
Mesh3d(meshes.add(Cuboid::new(1.0, 1.0, 1.0))),
MeshMaterial3d(materials.add(Color::srgb(0.3, 0.7, 0.9))),
));
commands.spawn((
Camera3d::default(),
Transform::from_xyz(0.0, 2.0, 4.0).looking_at(Vec3::ZERO, Vec3::Y),
));
commands.spawn(DirectionalLight::default());
}
3d は完全なプロファイルです。3d_bevy_render は Bevy のレンダラーを選択する低レベルのコレクションであり、3d_api はレンダラーを使わずにワールド側の 3D 型を提供します。プロファイルによって依存関係が削減されるのは、default-features = false の場合のみです。
フォワード方式とディファード方式
フォワード方式は、デフォルトの不透明オブジェクトの描画方式です。幅広いプラットフォームへの対応、MSAA、低い帯域幅、ライトの少なさ、マテリアルの柔軟性を重視する場合に適しています。ディファード方式は、不透明マテリアルのデータを G バッファーに格納します。ライトが多い場合、ジオメトリの処理を繰り返す量を減らせますが、より多くの帯域幅を使用し、MSAA に対応しません。
use bevy::{
core_pipeline::prepass::{DeferredPrepass, DepthPrepass},
pbr::DefaultOpaqueRendererMethod,
prelude::*,
};
fn enable_deferred(app: &mut App) {
app.insert_resource(DefaultOpaqueRendererMethod::deferred());
}
fn spawn_deferred_camera(mut commands: Commands) {
commands.spawn((
Camera3d::default(),
Msaa::Off,
DepthPrepass,
DeferredPrepass,
));
}
この選択が適用されるのは不透明オブジェクトのレンダリングです。透過マテリアルには、引き続き適切なフォワード/透過パスが必要です。ライトの数だけで選択せず、最小スペックのハードウェアで代表的なコンテンツをベンチマークしてください。
置き換える前に拡張する
次の段階に沿って拡張してください。
StandardMaterialのプロパティと、カメラ/ポストプロセスのコンポーネント。- シェーダーを特化させるための
Material、Material2d、またはMaterialExtension。 - レンダーワールドでの抽出/準備/キューイングのパイプライン。
- カスタムパス向けの
Core2d/Core3dにおける Bevy 0.19 のレンダーシステム。 - それ以前の段階では制約を満たせない場合に限り、完全な外部レンダラー。
カメラの ViewNode /レンダーグラフノード API は 0.19 で削除されました。レンダーパスは ViewQuery と RenderContext を使うシステムであり、実際のシステム関数、または Core3dSystems / Core2dSystems セットに対して順序付けます。トップレベルのスケジュール bevy::render::renderer::RenderGraph は、カメラ以外の処理向けに引き続き使用できます。
ヘッドレスまたは外部レンダリング
# Simulation/server: no render stack.
bevy = { version = "0.19", default-features = false, features = [
"default_app", "multi_threaded", "serialize"
] }
# External renderer that consumes Bevy's world-side 3D types.
# bevy = { version = "0.19", default-features = false, features = [
# "default_app", "3d_api"
# ] }
外部ブリッジでは、トランスフォーム、メッシュ、マテリアル、カメラ、可視性、アセットのライフタイム、GPU アップロード、ウィンドウ/サーフェスイベント、フレームペーシングの所有権と同期方法を定義する必要があります。レンダラー固有のハンドルは専用のコンポーネントに保持し、ゲームプレイのコンポーネントに持ち込まないでください。
Rapier との統合境界
Bevy 0.19 には、対応するリリース系列として bevy_rapier3d 0.36 を使用します。Rapier はデフォルトでは可変時間刻みで PostUpdate に実行されます。ティックに連動するゲームでは、明示的に FixedUpdate に移動できます。表示エンティティとコライダーには、同一の権威あるトランスフォーム方針を適用し、表示専用の平滑化は別に保ってください。bevy-physics と物理演算の境界を参照してください。
監査と参考資料
よくあるプロファイルと Rapier/デバッグ描画の不整合を検出するには、python3 scripts/audit_renderer_features.py path/to/Cargo.toml を実行します。