差分

ナビゲーションに移動 検索に移動

Metalでテクスチャから補正せずにサンプリングする

2,596 バイト追加, 2019年8月28日 (水) 05:42
ページの作成:「アップルが公式配布しているMetalコンピュートシェーダーを叩く超入門的なサンプルプログラム「Hello Compute」とい…」
[[アップル]]が公式配布している[[Metal]]で[[コンピュートシェーダー]]を叩く超入門的なサンプルプログラム「Hello Compute」というものがある。
* https://developer.apple.com/documentation/metal/hello_compute?language=objc

これは[[コンピュートシェーダー]]で[[テスクチャ]]を画像処理して新たなテクスチャを得て、それをフ[[ラグメントシェーダー]]で描画するという内容であり、いわゆる[[ハロワ]]に相当するものだ。

ただ、これは[[フラグメントシェーダー]]での描画の際に画像補正がかかってしまっている。
[[コンピュートシェーダー]]部分を差し替えて色々試していたのだが、どうやっても画像が歪んでしまい[[バグ]]ってるのかと思ったが、よくよく考えるとフラグメントシェーダーでの描画の際に画像補正がかかってしまっているのだった。

== HLSLの場合 ==
[[HLSL]]でテクスチャサンプリングの際に画像補正したくない場合は、サンプラーの設定でMinFilterやMagFilterにPOINTを設定し、画像補正を無効化する。
sampler Samp = sampler_state
{
Texture = <Tex>;
MinFilter = POINT;
MagFilter = POINT;
MipFilter = NONE;
AddressU = Clamp;
AddressV = Clamp;
};

== Metalの場合 ==
一方、[[Metal]]のサンプラーにはMinFilterやMgFilterにPOINT相当の設定がなく、サンプラーを経由すると強制的に補正がかかってしまう。このため等倍表示であっても画像がボヤけるという欠陥がある。
constexpr sampler textureSampler (mag_filter::linear,
min_filter::linear);
const half4 colorSample = colorTexture.sample (textureSampler, in.textureCoordinate);

これどうするんだと思ったがテクスチャにreadメソッドを発見。
サンプラーを経由せずにテクスチャからピクセルを読み取ればいいようだ。
ushort w = colorTexture.get_width();
ushort h = colorTexture.get_height();
ushort x = w * in.textureCoordinate.x ;
ushort y = h * in.textureCoordinate.y ;
const half4 colorSample = colorTexture.read(ushort2(pos));

== 関連項目 ==
* [[Xamarin.MacでMetalに対応したMacかを判定する]]
* [[MonoGameで直線を描画する]]
* [[Metal Shading Language]]
* [[プログラマブルシェーダー]]
* [[シェーダー]]

[[category: macOS]]
[[category: iOS]]
[[category: Metal]]
匿名利用者

案内メニュー