MFGドキュメント
Home
Getting Started
Reference
  • ja-JP
  • en-US
Home
Getting Started
Reference
  • ja-JP
  • en-US
  • MEP 18: デコレータをsamplerと揃える

MEP 18: デコレータをsamplerと揃える

  • Created: 2024-04-21 19:48:52

言語仕様としてはデコレータという汎用のものを用意しているが、使い道は結局シェーダーのサンプラーしか今の所ない。 また、名前をHalideにそろえていたが誰もHalide知らないのでシェーダーに揃っている方がいい。

MEP 9: repeat_edgeとconstant_exterior の改善


OpenGL

Sampler Object - OpenGL Wiki の「Edge value sampling」とその次のborder colorあたりを参照。

  • GL_REPEAT
  • GL_CLAMP_TO_EDGE
  • GL_CLAMP_TO_BOADER

mirrorも大抵おシェーダーにあるが、フィルタ処理ではいらないかな、と思うけどどうでしょ?

Direct2D

Border effect - Win32 apps - Microsoft Learn

  • D2D1_BORDER_EDGE_MODE_CLAMP
  • D2D1_BORDER_EDGE_MODE_WRAP
  • D2D1_BORDER_EDGE_MODE_MIRROR

定数を返す方法は無さそう?(GLのCLAMP_TO_BOADER相当)

Metal

MTLSamplerAddressMode - Apple Developer Documentation

  • ClampToEdge
  • Repeat
  • ClampToZero
  • ClampToBoarderColor

また、Metalの方でSamplerを定義するのは我らの問題と近い。

Metal SHading Language Specification.pdfの2.10より。

clamp_to_borderとからしい。

constexpr sampler s(coord::pixel,
 address::clamp_to_zero,
 filter::linear);

constexpr sampler a(coord::normalized);

constexpr sampler b(address::repeat);

constexpr sampler s(address::clamp_to_zero,
 filter::linear,
 compare_func::less);

constexpr sampler s(address::clamp_to_zero,
 filter::linear,
 compare_func::less,
max_anisotropy(10),
lod_clamp(0.0f, MAXFLOAT))

repeatは簡単だしどのシェーダーにもあるので実装してもいいかもしれない。


MFGの仕様を考える

MFGではどうするべきかを考える。

現状

現状は、以下の2つの組み合わせとなっている

境界

  • repeat_edge
  • constant_exterior

座標指定

  • 整数
  • fcoord_nearest
  • fcoord_linear

そしてconstant_exteriorには引数が必要。

直したい方針

組み合わせはenum値にしたい。そしてrepeat_edgeはCLAMP_TO_EDGE、constant_exteriorはCLAMP_TO_BORDERにしたい。

だが一方で、constant_exteriorかどうかは関数名で分かりたい気もする。 関数名で分からなくて良ければ以下のようになるが、

let sampler1 = sampler<input_u8>(coord=.NormalizedNearest, address=.ClampToEdge)
let sampler2 = sampler<input_u8>(coord=.NormalizedLinear, address=.ClampToBorderValue, boder=u8[1, 1, 1, 1])
let sampler3 = sampler<input_u8>(address=.ClampToEdge)
let sampler4 = sampler<input_u8>(address=.ClampToBorderValue, boder_value=u8[1, 1, 1, 1])
let sampler5 = sampler<input_u8>(coord=.NormalizedLinear)

boder_valueの引数の型チェックがinput_u8の型とclampのenum値に依存するので結構面倒。 また、将来拡張する事を考えた時に引数にborder_valueという名前なのもどうか?という気もする。 ただ拡張する時は別の名前を増やせばいいか。

なんかこれでいい気がしてきた。Metalの人には分かりやすいし、OpenGLの人でもそこまでわかりにくくはないだろう。

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