メインメニューを開く

「Metalでテクスチャから補正せずにサンプリングする」を編集中

警告: ログインしていません。編集を行うと、あなたの IP アドレスが公開されます。ログインまたはアカウントを作成すれば、あなたの編集はその利用者名とともに表示されるほか、その他の利点もあります。

この編集を取り消せます。 下記の差分を確認して、本当に取り消していいか検証してください。よろしければ変更を保存して取り消しを完了してください。

最新版 編集中の文章
1行目: 1行目:
 
[[アップル]]が公式配布している[[Metal]]で[[コンピュートシェーダー]]を叩く超入門的なサンプルプログラム「Hello Compute」というものがある。
 
[[アップル]]が公式配布している[[Metal]]で[[コンピュートシェーダー]]を叩く超入門的なサンプルプログラム「Hello Compute」というものがある。
 +
* https://developer.apple.com/documentation/metal/hello_compute?language=objc
  
*https://developer.apple.com/documentation/metal/hello_compute?language=objc
+
これは[[コンピュートシェーダー]]で[[テスクチャ]]を画像処理して新たなテクスチャを得て、それをフ[[ラグメントシェーダー]]で描画するという内容であり、いわゆる[[ハロワ]]に相当するものだ。
 
 
これは[[コンピュートシェーダー]]で[[テクスチャ]]を画像処理して新たなテクスチャを得て、それを[[フラグメントシェーダー]]で描画するという内容であり、いわゆる[[ハロワ]]に相当するものだ。
 
  
 
ただ、これは[[フラグメントシェーダー]]での描画の際に画像補正がかかってしまっている。
 
ただ、これは[[フラグメントシェーダー]]での描画の際に画像補正がかかってしまっている。
 
[[コンピュートシェーダー]]部分を差し替えて色々試していたのだが、どうやっても画像が歪んでしまい[[バグ]]ってるのかと思ったが、よくよく考えるとフラグメントシェーダーでの描画の際に画像補正がかかってしまっているのだった。
 
[[コンピュートシェーダー]]部分を差し替えて色々試していたのだが、どうやっても画像が歪んでしまい[[バグ]]ってるのかと思ったが、よくよく考えるとフラグメントシェーダーでの描画の際に画像補正がかかってしまっているのだった。
  
==HLSLの場合==
+
== HLSLの場合 ==
 
[[HLSL]]でテクスチャサンプリングの際に画像補正したくない場合は、サンプラーの設定でMinFilterやMagFilterにPOINTを設定し、画像補正を無効化する。
 
[[HLSL]]でテクスチャサンプリングの際に画像補正したくない場合は、サンプラーの設定でMinFilterやMagFilterにPOINTを設定し、画像補正を無効化する。
<source>
 
 
     sampler Samp = sampler_state
 
     sampler Samp = sampler_state
 
     {
 
     {
20行目: 18行目:
 
         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メソッドを発見。サンプラーを経由せずにテクスチャから[[ピクセル]]を読み取ればいいようだ。
 
<source>
 
    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(x,y));
 
</source>
 
 
 
Metalではテクスチャのサイズをget_widthやget_heightで簡単に取得できるので[[ソースコード]]の見通しが非常によい。[[HLSL]]や[[GLSL]]ではいちいち[[ユニフォーム変数]]などでテクスチャとは別に渡しておかねばならず非常に面倒だった点が改善されている。
 
  
==関連項目==
+
これどうするんだと思ったがテクスチャに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]]

MonoBookへの投稿はすべて、他の投稿者によって編集、変更、除去される場合があります。 自分が書いたものが他の人に容赦なく編集されるのを望まない場合は、ここに投稿しないでください。
また、投稿するのは、自分で書いたものか、パブリック ドメインまたはそれに類するフリーな資料からの複製であることを約束してください(詳細はMonoBook:著作権を参照)。 著作権保護されている作品は、許諾なしに投稿しないでください!

このページを編集するには、下記の確認用の質問に回答してください (詳細):

取り消し 編集の仕方 (新しいウィンドウで開きます)