メインメニューを開く

差分

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

402 バイト追加, 2023年2月28日 (火) 02:32
編集の要約なし
[[アップル]]が公式配布している[[Metal]]で[[コンピュートシェーダー]]を叩く超入門的なサンプルプログラム「Hello Compute」というものがある。
* https://developer.apple.com/documentation/metal/hello_compute?language=objc
*https://developer.apple.com/documentation/metal/hello_compute?language=objc これは[[コンピュートシェーダー]]で[[テスクチャテクスチャ]]を画像処理して新たなテクスチャを得て、それをフを画像処理して新たなテクスチャを得て、それを[[ラグメントシェーダーフラグメントシェーダー]]で描画するという内容であり、いわゆる[[ハロワ]]に相当するものだ。
ただ、これは[[フラグメントシェーダー]]での描画の際に画像補正がかかってしまっている。
[[コンピュートシェーダー]]部分を差し替えて色々試していたのだが、どうやっても画像が歪んでしまい[[バグ]]ってるのかと思ったが、よくよく考えるとフラグメントシェーダーでの描画の際に画像補正がかかってしまっているのだった。
== HLSLの場合 ==
[[HLSL]]でテクスチャサンプリングの際に画像補正したくない場合は、サンプラーの設定でMinFilterやMagFilterにPOINTを設定し、画像補正を無効化する。
<source>
sampler Samp = sampler_state
{
AddressV = Clamp;
};
</source>
== Metalの場合 ==
一方、[[Metal]]のサンプラーにはMinFilterやMgFilterにPOINT相当の設定がなく、サンプラーを経由すると強制的に補正がかかってしまう。このため等倍表示であっても画像がボヤけるという欠陥がある。
<source> constexpr sampler textureSampler (mag_filter::linear,
min_filter::linear);
const half4 colorSample = colorTexture.sample (textureSampler, in.textureCoordinate);</source> これどうするんだと思ったが[[テクスチャ]]にreadメソッドを発見。サンプラーを経由せずにテクスチャから[[ピクセル]]を読み取ればいいようだ。<source> 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));</source> 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]]