「Metalでテクスチャから補正せずにサンプリングする」を編集中
ナビゲーションに移動
検索に移動
この編集を取り消せます。 下記の差分を確認して、本当に取り消していいか検証してください。よろしければ変更を保存して取り消しを完了してください。
最新版 | 編集中の文章 | ||
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を設定し、画像補正を無効化する。 | ||
− | |||
sampler Samp = sampler_state | sampler Samp = sampler_state | ||
{ | { | ||
20行目: | 19行目: | ||
AddressV = Clamp; | AddressV = Clamp; | ||
}; | }; | ||
− | |||
==Metalの場合== | ==Metalの場合== | ||
一方、[[Metal]]のサンプラーにはMinFilterやMgFilterにPOINT相当の設定がなく、サンプラーを経由すると強制的に補正がかかってしまう。このため等倍表示であっても画像がボヤけるという欠陥がある。 | 一方、[[Metal]]のサンプラーにはMinFilterやMgFilterにPOINT相当の設定がなく、サンプラーを経由すると強制的に補正がかかってしまう。このため等倍表示であっても画像がボヤけるという欠陥がある。 | ||
− | + | 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); | ||
− | |||
これどうするんだと思ったが[[テクスチャ]]にreadメソッドを発見。サンプラーを経由せずにテクスチャから[[ピクセル]]を読み取ればいいようだ。 | これどうするんだと思ったが[[テクスチャ]]にreadメソッドを発見。サンプラーを経由せずにテクスチャから[[ピクセル]]を読み取ればいいようだ。 | ||
− | |||
ushort w = colorTexture.get_width(); | ushort w = colorTexture.get_width(); | ||
ushort h = colorTexture.get_height(); | ushort h = colorTexture.get_height(); | ||
39行目: | 34行目: | ||
const half4 colorSample = colorTexture.read(ushort2(x,y)); | const half4 colorSample = colorTexture.read(ushort2(x,y)); | ||
− | |||
− | |||
Metalではテクスチャのサイズをget_widthやget_heightで簡単に取得できるので[[ソースコード]]の見通しが非常によい。[[HLSL]]や[[GLSL]]ではいちいち[[ユニフォーム変数]]などでテクスチャとは別に渡しておかねばならず非常に面倒だった点が改善されている。 | Metalではテクスチャのサイズをget_widthやget_heightで簡単に取得できるので[[ソースコード]]の見通しが非常によい。[[HLSL]]や[[GLSL]]ではいちいち[[ユニフォーム変数]]などでテクスチャとは別に渡しておかねばならず非常に面倒だった点が改善されている。 | ||