「Metalでテクスチャから補正せずにサンプリングする」の版間の差分

編集の要約なし
10行目: 10行目:
==HLSLの場合==
==HLSLの場合==
[[HLSL]]でテクスチャサンプリングの際に画像補正したくない場合は、サンプラーの設定でMinFilterやMagFilterにPOINTを設定し、画像補正を無効化する。
[[HLSL]]でテクスチャサンプリングの際に画像補正したくない場合は、サンプラーの設定でMinFilterやMagFilterにPOINTを設定し、画像補正を無効化する。
<source>
     sampler Samp = sampler_state
     sampler Samp = sampler_state
     {
     {
19行目: 20行目:
         AddressV  = Clamp;
         AddressV  = Clamp;
     };
     };
</source>


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


これどうするんだと思ったが[[テクスチャ]]にreadメソッドを発見。サンプラーを経由せずにテクスチャから[[ピクセル]]を読み取ればいいようだ。
これどうするんだと思ったが[[テクスチャ]]にreadメソッドを発見。サンプラーを経由せずにテクスチャから[[ピクセル]]を読み取ればいいようだ。
<source>
     ushort w = colorTexture.get_width();
     ushort w = colorTexture.get_width();
     ushort h = colorTexture.get_height();
     ushort h = colorTexture.get_height();
34行目: 39行目:
   
   
     const half4 colorSample = colorTexture.read(ushort2(x,y));
     const half4 colorSample = colorTexture.read(ushort2(x,y));
</source>
Metalではテクスチャのサイズをget_widthやget_heightで簡単に取得できるので[[ソースコード]]の見通しが非常によい。[[HLSL]]や[[GLSL]]ではいちいち[[ユニフォーム変数]]などでテクスチャとは別に渡しておかねばならず非常に面倒だった点が改善されている。
Metalではテクスチャのサイズをget_widthやget_heightで簡単に取得できるので[[ソースコード]]の見通しが非常によい。[[HLSL]]や[[GLSL]]ではいちいち[[ユニフォーム変数]]などでテクスチャとは別に渡しておかねばならず非常に面倒だった点が改善されている。