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の人でもそこまでわかりにくくはないだろう。