メインメニューを開く

差分

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

58 バイト追加, 2020年6月19日 (金) 07:30
編集の要約なし
==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]]ではいちいち[[ユニフォーム変数]]などでテクスチャとは別に渡しておかねばならず非常に面倒だった点が改善されている。