以前WebGPUで反応拡散系を動かした時にテクスチャのサンプルにフィルタが使えなかった理由がわかった。
反応拡散系で計算するバッファをストレージで用意して、その計算結果をテクスチャにコピーして、画面描画に利用していた。 その際にテクスチャサンプラーのフィルターを有効にするとエラーが出てしまっていた。
ドキュメントcreateTextureのformatのTexture formatsの説明の下の方に
GPUTextureSampleType "float"("unfilterable-float"だけじゃなく)をサポートしていればフォーマットはフィルター可能; つまり"filtering" GPUSamplerで使えます。 § 26.1 テクスチャフォーマット機能を参照してください。
とのことでそのrgbafloat32フォーマットの行を見てみると、
"unfilterable-float""float32-filterable"が有効なら"float"
とのことでリンクは§ 25 フィーチャーインデックスを指すがよくわからず。 ググってみるとフィルタ可能な 32 ビット浮動小数点テクスチャという記事に説明が書かれていた:
adapter.features.has("float32-filterable")で確認- デバイス生成時に
adapter.requestDevice({requiredFeatures: ["float32-filterable"]})
なのでデフォルトではrgba32floatフォーマットのテクスチャはフィルター利用は不可能で、デバイス生成時に必要な機能として指定する必要があった。
でようやくmagFilterやminFilterを指定したサンプラーを使えるようになった。
注意点はバインドレイアウトグループにもsampler.typeに'non-filtering'じゃなく'filitering'を、texture.sampleTypeに'unfilterable-float'じゃなく'float'を指定する必要がある。