「Metalでテクスチャから補正せずにサンプリングする」を編集中
ナビゲーションに移動
検索に移動
この編集を取り消せます。 下記の差分を確認して、本当に取り消していいか検証してください。よろしければ変更を保存して取り消しを完了してください。
最新版 | 編集中の文章 | ||
1行目: | 1行目: | ||
[[アップル]]が公式配布している[[Metal]]で[[コンピュートシェーダー]]を叩く超入門的なサンプルプログラム「Hello Compute」というものがある。 | [[アップル]]が公式配布している[[Metal]]で[[コンピュートシェーダー]]を叩く超入門的なサンプルプログラム「Hello Compute」というものがある。 | ||
+ | * https://developer.apple.com/documentation/metal/hello_compute?language=objc | ||
− | + | これは[[コンピュートシェーダー]]で[[テスクチャ]]を画像処理して新たなテクスチャを得て、それをフ[[ラグメントシェーダー]]で描画するという内容であり、いわゆる[[ハロワ]]に相当するものだ。 | |
− | |||
− | これは[[コンピュートシェーダー]]で[[ | ||
ただ、これは[[フラグメントシェーダー]]での描画の際に画像補正がかかってしまっている。 | ただ、これは[[フラグメントシェーダー]]での描画の際に画像補正がかかってしまっている。 | ||
[[コンピュートシェーダー]]部分を差し替えて色々試していたのだが、どうやっても画像が歪んでしまい[[バグ]]ってるのかと思ったが、よくよく考えるとフラグメントシェーダーでの描画の際に画像補正がかかってしまっているのだった。 | [[コンピュートシェーダー]]部分を差し替えて色々試していたのだが、どうやっても画像が歪んでしまい[[バグ]]ってるのかと思ったが、よくよく考えるとフラグメントシェーダーでの描画の際に画像補正がかかってしまっているのだった。 | ||
− | ==HLSLの場合== | + | == HLSLの場合 == |
[[HLSL]]でテクスチャサンプリングの際に画像補正したくない場合は、サンプラーの設定でMinFilterやMagFilterにPOINTを設定し、画像補正を無効化する。 | [[HLSL]]でテクスチャサンプリングの際に画像補正したくない場合は、サンプラーの設定でMinFilterやMagFilterにPOINTを設定し、画像補正を無効化する。 | ||
− | |||
sampler Samp = sampler_state | sampler Samp = sampler_state | ||
{ | { | ||
20行目: | 18行目: | ||
AddressV = Clamp; | AddressV = Clamp; | ||
}; | }; | ||
− | |||
− | ==Metalの場合== | + | == Metalの場合 == |
一方、[[Metal]]のサンプラーにはMinFilterやMgFilterにPOINT相当の設定がなく、サンプラーを経由すると強制的に補正がかかってしまう。このため等倍表示であっても画像がボヤけるという欠陥がある。 | 一方、[[Metal]]のサンプラーにはMinFilterやMgFilterにPOINT相当の設定がなく、サンプラーを経由すると強制的に補正がかかってしまう。このため等倍表示であっても画像がボヤけるという欠陥がある。 | ||
− | + | constexpr sampler textureSampler (mag_filter::linear, | |
− | |||
min_filter::linear); | min_filter::linear); | ||
− | + | const half4 colorSample = colorTexture.sample (textureSampler, in.textureCoordinate); | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | == | + | これどうするんだと思ったがテクスチャにreadメソッドを発見。 |
+ | サンプラーを経由せずにテクスチャからピクセルを読み取ればいいようだ。 | ||
+ | ushort w = colorTexture.get_width(); | ||
+ | ushort h = colorTexture.get_height(); | ||
+ | ushort x = w * in.textureCoordinate.x ; | ||
+ | ushort y = h * in.textureCoordinate.y ; | ||
+ | const half4 colorSample = colorTexture.read(ushort2(pos)); | ||
− | *[[Xamarin.MacでMetalに対応したMacかを判定する]] | + | == 関連項目 == |
− | *[[MonoGameで直線を描画する]] | + | * [[Xamarin.MacでMetalに対応したMacかを判定する]] |
− | *[[Metal Shading Language]] | + | * [[MonoGameで直線を描画する]] |
− | *[[プログラマブルシェーダー]] | + | * [[Metal Shading Language]] |
− | *[[シェーダー]] | + | * [[プログラマブルシェーダー]] |
+ | * [[シェーダー]] | ||
[[category: macOS]] | [[category: macOS]] | ||
[[category: iOS]] | [[category: iOS]] | ||
[[category: Metal]] | [[category: Metal]] |