ShaderUnityのコンピュートシェーダについて簡単にまとめました。Shaderコンピュートシェーダを書くスクリプトを書く実行する参考GPUを描画以外の用途で使うGPGPUGPUは描画をするために作られた処理装置です。フラグメントシェーダでは画面上の各ピクセルごとに計算を行うので、CPUとは異なり大量に並列で計算を行うことができるように作られています。シミュレーションの計算や仮想通貨のマイニングなどにも使われるようになりました。Units)といいます。ShaderさてGPGPUは初めはグラフィックスAPIをうまく利用して実装していたようですが、GPGPUに注目が集まるにつれて次第に専用のAPIが開発されていきます。そのうちの一つとしてDirectComputeがあります。Shaderと呼ばれるプログラムを書くと、GPUの計算資源をグラフィックスではなくGPGPUに適した形で使うことができます。ShaderさてUnityのコンピュートシェーダは、Unity上でGPGPUを実現するための機能です。マニュアルを見ると、これはDirectComputeとほぼ同じものであるという説明がされています。technology.https://docs.unity3d.com/Manual/class-ComputeShader.html対応しているプラットフォームは今のところ以下の通りです。3.1以上のAndroidPS4とかコンピュートシェーダを書くそれでは実際にUnityでコンピュートシェーダを書いてみます。Shaderを選択します。すると.computeという拡張子のファイルが生成されるので、中身を以下のように書き換えます。CSMainで並列実行する処理を指定しています。ここではCSMain関数を並列実行します。この一つの処理をカーネルと呼びます。カーネルを処理する単位をスレッドと呼びます。3つのスレッドを同時に走らせる場合は3つのカーネルが並列実行されます。このスレッド数は三次元の値で表され、これらの値を掛け合わせたものが実行されるスレッド数になります。1)]としている部分がスレッド数の定義です。3スレッドが並列実行されます。intBuffer;はコンピュートシェーダが読み書きするためのバッファです。今回のカーネルでは、SV_GroupThreadIDセマンティクスを使って今処理しているスレッドのインデックスを取得し、それに対応するバッファを適当に書き換えています。セマンティクスを使うと、他にもいろいろな情報をカーネルで扱えます。これについては以下の記事がわかりやすくまとまっていたのでご参照ください。scrapbox.ioスクリプトを書くさてこうして作ったコンピュートシェーダはスクリプトから制御する必要があります。}}さて上記のソースコードでは、まずStart()でコンピュートシェーダの初期化を行っています。具体的には、computeShader.FindKernel()でカーネルのインデックスを取得しています。並列実行するサイズに応じたComputeBufferを生成し、コンピュートシェーダにセットしています。コンピュートシェーダの実行はUpdate()で行っています。ComputeShader.Dispatch()でカーネルを指定して並列処理を実行しています。ここで、このメソッドの第二~第四引数は「グループ」を指定しています。グループはスレッドを並列実行する単位で、並列数はスレッドと同じく3次元の値で管理されます。6つの処理が並列実行されることになります。今回はグループは一つだけにしています。コンピュートシェーダによる計算結果はComputeBuffer.GetData()で取得します。ComputeBufferは明示的に開放する必要があるので注意が必要です。解放するにはComputeBuffer.Release()を実行します。実行するさてそれではこのスクリプトを適当なGameObjectにアタッチして実行してみます。スペースボタンを押すたびにバッファの値が変わっていけば成功です。»プロフィールUnityエンジニア。グラフィックスへの興味が強めです。インストールから基本的な使い方・注意点まとめ【Unity】【エディタ拡張】テクスチャを指定したUV座標で切り取って保存する【Unity】指定したアセットのAssetBundle名を取得する【Unity】【シェーダ】スクリプトからVP行列を渡してシェーダで座標変換に使う【Unity】【シェーダ】FloatやVectorをリニアライズ対象にするGammaアトリビュート月別アーカイブはてなブログをはじめよう!halya_11さんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。