#対象
・コンピュートシェーダーを始めてみたいけど、どんなものが必要かどうかわからない人。
・シェーダーに興味ある人
・とりあえず、コンピュートシェーダーを行うに当たって、理解より、作りたい人
##Backもしくは参考記事へ飛ぼうの対象者
・コンピュートシェーダーを概念から学びたい人。
・やるというより、理解したいステップの人
#開発環境
Unity5.6.1f
VisualStudio2015Pro(Comminityでもたぶん問題ない)
もしくは
Unity2017.1f
VisualStudio2017Comminity
#今回この記事で行う事。
GPUに対して、計算を行って、その結果を返す。
#この記事でやる事に対して、必要な事。(ざっくり)
・コンピュートシェーダーの作成
1.カーネル(関数みたいなもの)の宣言。
2.こういうカーネルがあるよっていう宣言
3.計算の受け渡しなどを行う為の入れ物の宣言
4.(場合によっては、値を受け取るだけの変数の宣言)
・CPU側のスクリプトの作成
5.シェーダーの関数へのアクセスの確保
6.計算の受け渡しのできる入れ物の作成。
7.(場合によっては、値を入れる)
8.GPU側への値の呼び出し。
9.GPUからの値の受け取り。
といった流れになります。
#では順を追って作業
###1.カーネルの宣言 と2.こういうカーネルがあるよっていう宣言
以下のようなコード
#pragma kernel CSMain //...2
///...1
[numthreads(4,1,1)]
void CSMain (uint3 id : SV_DispatchThreadID)
{
}
カーネルの宣言には、
呼ぶための関数・・・1カーネルの宣言
カーネル存在の宣言...2こういうカーネルがあるよ
###3.計算の受け渡しなどを行う為の入れ物の宣言
RWStructuredBuffer<int> int_result;
###4.(場合によっては、値を受け取るだけの変数の宣言)
普通に宣言するだけ。
int num;
###5.シェーダーの関数へのアクセスの確保
int shader_kanel = compute_shader.FindKernel("CSMain");
###6.計算の受け渡しのできる入れ物の作成。
//5の部分は必要な数字を入れる
ComputeBuffer buffer = new ComputeBuffer(5, sizeof(int));
###7.(場合によっては、値を入れる)
int[] set_data = new int[5];
for(int _i = 0; _i < 5;_i++)
{
set_data[_i] = _i;
Debug.Log("数字:" + set_data[_i]);
}
buffer.SetData(set_data);
compute_shader.SetBuffer(shader_kanel, "int_result",buffer);
###8.GPU側への値の呼び出し。
compute_shader.Dispatch(shader_kanel, 1, 1, 1);
###9.GPUからの値の受け取り。
//sample6と合わせて
buffer.GetData(set_data);
#やる上で私が引っかかったこと。
###・Platform関係の設定
特に、普段Androidなどを開発している場合などでEditorで実行しようとすると
Errorが出ます。(以下のようなエラー)
Platform does not support compute shaders
これはAndroid等の開発を行っていて、Editorで実行しようとするとなります。
推測ですが、PCでの実行なのにAndroidの実行でやろうとしてるがサポートしてないからー
といった感じでしょうか
#サンプルコード全体
RWStructuredBuffer<int> int_result;
[numthreads(4,1,1)]
void CSMain (uint3 id : SV_DispatchThreadID)
{
int_result[id.x] += id.x;
}
#region need compute_shader_sample
///inspectorから設定を行う。
public ComputeShader compute_shader;
private ComputeBuffer buffer;
private int shader_kanel;
private int[] set_data;
#endregion
private void Start()
{
if(null == compute_shader)
{
return;
}
shader_kanel = compute_shader.FindKernel("CSMain");
buffer = new ComputeBuffer(5, sizeof(int));
set_data = new int[5];
for(int _i = 0; _i < 5;_i++)
{
set_data[_i] = _i;
Debug.Log("数字:" + set_data[_i]);
}
buffer.SetData(set_data);
compute_shader.SetBuffer(shader_kanel, "int_result",buffer);
compute_shader.Dispatch(shader_kanel, 1, 1, 1);
buffer.GetData(set_data);
//計算された結果が返ってくる
for(int _i = 0; _i < 5;_i++)
{
Debug.Log("処理後の数字:" + set_data[_i]);
}
}
#参考にした記事。
Unity : ComputeShader のシンプルなサンプル(1)
http://neareal.com/2601/
結構基礎から、記事にされているので、興味がわいたら、この記事を参考に、進めてみても良いかもしれません。
概要とかも書かれている。やり方や、サンプル
Qiita:AndroidでComputeShaderのテスト
https://qiita.com/fukaken5050/items/7526b0dd9307b23700e5