MFGドキュメント
Home
Getting Started
Reference
  • ja-JP
  • en-US
Home
Getting Started
Reference
  • ja-JP
  • en-US
  • サンプラー

サンプラー

  • 前: ifelとループ
  • トップへ

テンソルのロード方法をカスタマイズする機能として、サンプラーというものがあります。

let finput = sampler<input_u8>(address=.ClampToEdge, coord=.NormalizedLinear)

以後、このfinputは通常のテンソルのように使えます。

samplerには以下の3つを基本的には指定します。

  • テンソル
  • アドレスモード(address引数)
  • 座標指定(coord引数)

この3つを順番に見ていきましょう。

テンソルの指定

samplerは対象とするテンソルから値を取得する時に、その取得の仕方をカスタマイズするものです。 ですから必ず、対象とするテンソルを指定します。

MFGではテンソルは変数とは違う特別なものになるため、シンタックス上も他の引数とは区別しています。 テンソルの指定はどこでも角括弧、つまり<>で囲んで指定します。

以下はinput_u8を指定する例です。

sampler<input_u8>(...)

アドレスモード(address引数)

境界より外の座標を指定した時の振る舞いを指定するものを、アドレスモードと呼んでいます。

アドレスモードはEnum型で以下の3つのうちのどれかを指定します。

Enumのシンボル効果
Noneデフォルト。はみ出し処理を何もしない、動作は未定義(プログラム的にはみ出さない事が分かっている時の処理)
ClampToEdge端の値を繰り返す
ClampToBorderValueborder_valueで指定した値

Enumを引数で使う時は.で始める事に注意。

ClampToBorderValueの時だけborder_valueという追加の引数が必要になります。

let extend = sampler<input_u8>(address=.ClampToBorderValue, border_value=u8[0, 0, 0, 0])

border_valueの値の型はテンソルの要素の型と揃っている必要があります。

座標指定(coord引数)

座標指定には、通常のピクセル単位のi32と、0.0〜1.0にnormalizeされたf32の座標指定が選べます。 f32にnormalizeされた座標では、間を指定した時の挙動により二種類のEnumがあります。

Enumのシンボル解説
Pixelデフォルト。i32で指定
NormalizedNearest0.0〜1.0で、間の値は一番近いピクセルが使われる
NormalizedLinear0.0〜1.0で間の値はbinlinearで補間される

NormalizedXXX系を指定すると、以下のように引数をf32で指定するようになります。

let finput = sampler<input_u8>(coord=.NormalizedLinear)
finput(0.3, 0.7)

テンソル定義で現在の座標をこのf32にnormalizeされた座標に変換するためには、 テンソルのto_ncoordが使えます。

let finput = sampler<input_u8>(coord=.NormalizedLinear)

def result_u8 |x, y| {
   let fxy = to_ncoord([x, y])
   let col = finput(*fxy)
   ...
}

なお、このアスタリスクはsplat演算子です。 詳細はテンソルを参照ください。

サンプラーの引数は名前つき引数として使えます

coordやaddress、border_valueは名前つき引数として使えます。

次

transとreduce

最終更新: 2025/11/20 15:14
Contributors: Kazuma Arino