差分

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

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

337 バイト追加, 2019年8月28日 (水) 05:52
[[アップル]]が公式配布している[[Metal]]で[[コンピュートシェーダー]]を叩く超入門的なサンプルプログラム「Hello Compute」というものがある。
 * https://developer.apple.com/documentation/metal/hello_compute?language=objc
これは[[コンピュートシェーダー]]で[[テスクチャ]]を画像処理して新たなテクスチャを得て、それをフ[[ラグメントシェーダー]]で描画するという内容であり、いわゆる[[ハロワ]]に相当するものだ。
[[コンピュートシェーダー]]部分を差し替えて色々試していたのだが、どうやっても画像が歪んでしまい[[バグ]]ってるのかと思ったが、よくよく考えるとフラグメントシェーダーでの描画の際に画像補正がかかってしまっているのだった。
== HLSLの場合 ==
[[HLSL]]でテクスチャサンプリングの際に画像補正したくない場合は、サンプラーの設定でMinFilterやMagFilterにPOINTを設定し、画像補正を無効化する。
sampler Samp = sampler_state
};
== 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(x,y));Metalではテクスチャのサイズをget_widthやget_heightで簡単に取得できるので[[ソースコード]]の見通しが非常によい。[[HLSL]]や[[GLSL]]ではいちいち[[ユニフォーム変数]]などでテクスチャとは別に渡しておかねばならず非常に面倒だった点が改善されている。
これどうするんだと思ったが[[テクスチャ]]に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]]
匿名利用者

案内メニュー