メインメニューを開く

差分

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

57 バイト追加, 2023年2月28日 (火) 02:32
編集の要約なし
*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();
const half4 colorSample = colorTexture.read(ushort2(x,y));
</source>
 
Metalではテクスチャのサイズをget_widthやget_heightで簡単に取得できるので[[ソースコード]]の見通しが非常によい。[[HLSL]]や[[GLSL]]ではいちいち[[ユニフォーム変数]]などでテクスチャとは別に渡しておかねばならず非常に面倒だった点が改善されている。