【WebGPU】floatテクスチャにフィルタを使用したい場合

2024-12-11

以前WebGPUで反応拡散系を動かした時にテクスチャのサンプルにフィルタが使えなかった理由がわかった。

反応拡散系で計算するバッファをストレージで用意して、その計算結果をテクスチャにコピーして、画面描画に利用していた。 その際にテクスチャサンプラーのフィルターを有効にするとエラーが出てしまっていた。

ドキュメントcreateTextureformatTexture formatsの説明の下の方に

GPUTextureSampleType "float""unfilterable-float"だけじゃなく)をサポートしていればフォーマットはフィルター可能; つまり"filtering" GPUSamplerで使えます。 § 26.1 テクスチャフォーマット機能を参照してください。

とのことでそのrgbafloat32フォーマットの行を見てみると、

とのことでリンクは§ 25 フィーチャーインデックスを指すがよくわからず。 ググってみるとフィルタ可能な 32 ビット浮動小数点テクスチャという記事に説明が書かれていた:

  • adapter.features.has("float32-filterable") で確認
  • デバイス生成時にadapter.requestDevice({requiredFeatures: ["float32-filterable"]})

なのでデフォルトではrgba32floatフォーマットのテクスチャはフィルター利用は不可能で、デバイス生成時に必要な機能として指定する必要があった。 でようやくmagFilterminFilterを指定したサンプラーを使えるようになった。

注意点はバインドレイアウトグループにもsampler.type'non-filtering'じゃなく'filitering'を、texture.sampleType'unfilterable-float'じゃなく'float'を指定する必要がある。