「Metalでテクスチャから補正せずにサンプリングする」の版間の差分
Administrator (トーク | 投稿記録) 編集の要約なし |
|||
| (同じ利用者による、間の3版が非表示) | |||
| 3行目: | 3行目: | ||
*https://developer.apple.com/documentation/metal/hello_compute?language=objc | *https://developer.apple.com/documentation/metal/hello_compute?language=objc | ||
これは[[コンピュートシェーダー]]で[[ | これは[[コンピュートシェーダー]]で[[テクスチャ]]を画像処理して新たなテクスチャを得て、それを[[フラグメントシェーダー]]で描画するという内容であり、いわゆる[[ハロワ]]に相当するものだ。 | ||
ただ、これは[[フラグメントシェーダー]]での描画の際に画像補正がかかってしまっている。 | ただ、これは[[フラグメントシェーダー]]での描画の際に画像補正がかかってしまっている。 | ||
| 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相当の設定がなく、サンプラーを経由すると強制的に補正がかかってしまう。このため等倍表示であっても画像がボヤけるという欠陥がある。 | ||
constexpr sampler textureSampler (mag_filter::linear, | <source> | ||
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]]ではいちいち[[ユニフォーム変数]]などでテクスチャとは別に渡しておかねばならず非常に面倒だった点が改善されている。 | ||