2016-12-07 12 views
4

標準vertexおよびfragment機能に加えて、メタルサポートkernelがサポートされています。私は、画像をグレースケールに変換するメタルのkernelを見つけました。メタル計算カーネルとフラグメントシェーダ

これはkernelfragmentの違いは何ですか? fragmentシェーダができない、またはその逆の場合、kernelは何を行うことができますか?あなただけのグラフィックスプログラミングをやっている場合は

  • MTLRenderCommandEncoder
  • MTLComputeCommandEncoder
  • MTLBlitCommandEncoder
  • MTLParallelRenderCommandEncoder

、あなたがしている:

+0

主な違いは、フラグメント機能と同じように、頂点位置(または他のメッシュ/ジオメトリデータ)をカーネル関数に送信できないことです。フラグメント関数は、出力テクスチャの各ピクセルの色を返します(通常は)、戻り値を持たないカーネル関数(void)は、テクスチャまたはバッファ上で動作し、上に行くことができるグリッド上で同時に多くのスレッドを同時に実行できます何百万というスレッド。カーネルはGPGPUや科学的シミュレーションでも画像処理に使用されますが、フラグメント機能はレンダリングにしか使用できません。 – Marius

+0

基本的にiOSのOpenCL? –

+0

あなたはそうそう思います。しかし、iOSだけでなくMetalは、tvOSとmacOSでも動作します。 – Marius

答えて

4

金属は、コマンドエンコーダの4種類があります最もよく知っているのはMTLRenderCommandEncoder。ここで、頂点シェーダーとフラグメントシェーダーを設定します。これは、多くの描画呼び出しとオブジェクトプリミティブを処理するために最適化されています。

カーネルシェーダーは主にMTLComputeCommandEncoder.で使用されています。カーネルシェーダーと計算エンコーダーが画像処理の例で使用されたのは、レンダリングコマンドエンコーダーのようにプリミティブを描画していないからです。両方の方法がグラフィックスを利用していますが、この例では、画面上の複数のオブジェクトの深さを計算するのではなく、単にテクスチャ上のカラーデータを変更しています。

計算コマンドエンコーダは、より簡単にスレッドを使用して並列計算を行うように設定されている:

https://developer.apple.com/reference/metal/mtlcomputecommandencoder

アプリケーションがデータ変更にマルチスレッドを利用したいのであれば、それはこのコマンドでそれを行う方が簡単ですレンダリングコマンドエンコーダよりも高いエンコーダである。

関連する問題