examples/bevyのバグ修正(自分へのノート)
これはdioxusのテクスチャの上にbevyが描画するデモ。
https://github.com/DioxusLabs/dioxus を適当な場所にgit clone
cd dioxus\examples\bevy
cargo run
Fetching d:\study\dioxus\examples\bevy\src\styles.css
Error fetching d:\study\dioxus\examples\bevy\src\styles.css[1.0, 0.0, 0.0]
: ReqwestError(reqwest::Error { kind: Builder, url: "dioxus\\examples\\bevy\\src\\styles.css", source: BadScheme })
bevyフォルダ内のstyles.cssがエラーの原因らしい。
JetBrainsのRustRooverを使っているので、Junieに修正依頼する:
main.rsの冒頭にある static STYLES: Asset = asset!("/src/styles.css");
を削除して、app()に以下の1行を追加した:
rsx!(
document::Style { { include_str!("styles.css") } }
これで無事動くようになった。しかし、以下の警告が気に入らないので、
Junieに改善方法を尋ねた(ここからが長かった):
警告:2025-09-23T00:54:58.211504Z INFO bevy_render::batching::gpu_preprocessing: Some GPU preprocessing are limited on this device.
問題なのは以下の箇所:
2025-09-23T00:54:58.221502Z WARN bevy_pbr::ssao: ScreenSpaceAmbientOcclusionPlugin not loaded.
GPU lacks support: Limits::max_storage_textures_per_shader_stage is less than 5.
Fetching dioxus\examples\bevy\src\styles.css
私はGPUにRTX 4070 SUPERを使っている のになぜ?
Junie: ログの意味は次のとおりです。
•Some GPU preprocessing are limited on this device.
◦WGPU(Bevy が使うグラフィックス抽象レイヤー)が、デバイスに対して“低めのリミット値”で初期化されたため、一部の GPU 前処理が制限される、という一般的な通知です。
•ScreenSpaceAmbientOcclusionPlugin not loaded. GPU lacks support: Limits::max_storage_textures_per_shader_stage is less than 5.
◦Bevy の SSAO(スクリーンスペースアンビエントオクルージョン)を有効化するには、1 つのシェーダーステージで最低 5 個の「ストレージテクスチャ(writeable なテクスチャ)」を扱える必要があります。ところが、作成された wgpu::Device に設定されたリミット max_storage_textures_per_shader_stage が 5 未満(多くの場合 0)だったため、SSAO プラグインは自動的に無効化されましたハードウェアとしては十分対応しています。問題は「実際に作られた WGPU デバイスに対して、どのリミット値を要求したか」です。
•WGPU では、デバイス作成時に「要求リミット(wgpu::Limits)」を渡します。これは「この値以下で作ってくれ」という下限ではなく、むしろ「この上限まで使う想定で作る」という“要求値”です。要求が低すぎると、その低い値に“固定”されます。
•Limits::default() は互換性重視の低い値(D3D11/GL/WEBGL2 を意識したダウンレベル既定)になっていることが多く、ここでは max_storage_textures_per_shader_stage が 0 近辺に設定されます。そのため、高性能 GPU でも機能が無効化されます。
•あなたのコードでは limits() で max_storage_buffers_per_shader_stage だけ 12 に上書きし、他は ..Limits::default() のままです。その結果、max_storage_textures_per_shader_stage は低いままになり、Bevy の SSAO 条件(>=5)を満たせません。
修正法:
最低でも max_storage_textures_per_shader_stage を 5 以上にしてデバイスを作成してください。RTX 4070 SUPER なら 8 や 16 にしても通常問題ありません(最終的にはアダプタがサポートする最大値以下に丸められます)。
あなたの現在の dioxus\examples\bevy\src\main.rs では次のように変更できます。
fn limits() -> wgpu::Limits {
wgpu::Limits {
// SSAO が必要とする閾値以上にする
max_storage_textures_per_shader_stage: 8, // 5 以上なら OK。8〜16 推奨
// 既存の設定を維持
max_storage_buffers_per_shader_stage: 12,
..wgpu::Limits::default() // 他の値は既定
}
}
より堅牢にするなら、アダプタが持つ“最大”を基準に、必要なフィールドだけを上書きする方法があります(using_resolution を使う):
// 例: アダプタのリミットを取得できる場合
let adapter_limits = /* adapter.limits() 等で取得 */;
let requested = wgpu::Limits::default()
.using_resolution(adapter_limits) // アダプタ側の上限で解像
.with_max_storage_textures_per_shader_stage(8) // 必要分を保証
.with_max_storage_buffers_per_shader_stage(12);
フレームワーク側(dioxus_native::launch_cfg)が Limits を受け取り、実際の Device をそのリミットで作る設計なので、ここを適切に指定するのが最短です。
前者を採用して、
ログの詳細を出す: RUST_LOG=wgpu_core=info,wgpu_hal=info,bevy_pbr=info などで起動し、実際に作られたデバイスのリミットがどうなっているかを確認します。
$env:RUST_LOG = "info,\
bevy_log=off,\
bevy_diagnostic=off,\
bevy_render::batching::gpu_preprocessing=off,\
wgpu_hal::vulkan::instance=warn,\
wgpu_hal::vulkan::conv=warn"
cargo run
これでも肝心な値が出てこないので、GPU関係の設定値などをすべて出すように、
bevy_render.rsに以下を追加:
pub fn new(instance: &Instance, device_handle: &DeviceHandle) -> Self {
// 既存処理の前後どこでもOK(1回出せればよい)意地でもSSAOの値を出したいので
let adapter_info = device_handle.adapter.get_info();
let limits = device_handle.device.limits();
info!(?adapter_info, ?limits, "WGPU device/adapter caps");
// 必要なら SSAO 閾値チェック
if limits.max_storage_textures_per_shader_stage < 5 {
warn!(
value = limits.max_storage_textures_per_shader_stage,
"SSAO要件未満: max_storage_textures_per_shader_stage < 5"
);
}
やっと
2025-09-23T06:36:24.376924Z INFO bevy_example::bevy_renderer: WGPU device/adapter caps adapter_info=
AdapterInfo { name: "NVIDIA GeForce RTX 4070 SUPER",
...max_storage_textures_per_shader_stage: 8 ...}
ところが、一瞬おどろいたのが、
2025-09-23T07:36:44.180666Z INFO bevy_render::batching::gpu_preprocessing:
Some GPU preprocessing are limited on this device.
Junie: 出所: bevy_render::batching::gpu_preprocessing
•意味: WGPU のリミット(例えば bind や subgroup 関係など)により、Bevy の一部「GPU 前処理最適化」がフル機能で使えないパスにフォールバックしたことを知らせる情報ログです。
•重要度: ほぼ無害で、描画品質や機能に直結しないことがほとんどです。SSAO の可否とは無関係です。(確かに😊)
•対処: 気になるならログでミュートできます。
ログに出るはずだと信じて、時間を無駄に消費した😂
初めてJunieを使ったが、VS codeで愛用しているGemini Code Assistantとに負けていないかも。