以前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'
を指定する必要がある。