Unityのコンピュートシェーダー事始め

#対象
・コンピュートシェーダーを始めてみたいけど、どんなものが必要かどうかわからない人。
・シェーダーに興味ある人
・とりあえず、コンピュートシェーダーを行うに当たって、理解より、作りたい人

##Backもしくは参考記事へ飛ぼうの対象者
・コンピュートシェーダーを概念から学びたい人。
・やるというより、理解したいステップの人


#開発環境
Unity5．6.1f
VisualStudio2015Pro（Comminityでもたぶん問題ない）

もしくは
Unity2017.1f
VisualStudio2017Comminity


#今回この記事で行う事。
GPUに対して、計算を行って、その結果を返す。

#この記事でやる事に対して、必要な事。（ざっくり）
・コンピュートシェーダーの作成
１.カーネル（関数みたいなもの）の宣言。
２.こういうカーネルがあるよっていう宣言
３．計算の受け渡しなどを行う為の入れ物の宣言
４.（場合によっては、値を受け取るだけの変数の宣言）


・CPU側のスクリプトの作成
５．シェーダーの関数へのアクセスの確保
６．計算の受け渡しのできる入れ物の作成。
７．（場合によっては、値を入れる）
８.GPU側への値の呼び出し。
９.GPUからの値の受け取り。

といった流れになります。



#では順を追って作業
###1.カーネルの宣言　と２．こういうカーネルがあるよっていう宣言
以下のようなコード

```sample1.compute

#pragma kernel CSMain　//...2

///...1
[numthreads(4,1,1)]
void CSMain (uint3 id : SV_DispatchThreadID)
{
	
}

```
カーネルの宣言には、
呼ぶための関数・・・１カーネルの宣言
カーネル存在の宣言...２こういうカーネルがあるよ


###3.計算の受け渡しなどを行う為の入れ物の宣言


```sample2.compute

RWStructuredBuffer<int> int_result;

```

###4.（場合によっては、値を受け取るだけの変数の宣言）
普通に宣言するだけ。
```sample3.compute
int num;
```


###５．シェーダーの関数へのアクセスの確保

```sample4.cs
int shader_kanel = compute_shader.FindKernel("CSMain");
```


###６．計算の受け渡しのできる入れ物の作成。

```sample5.cs
//５の部分は必要な数字を入れる
ComputeBuffer buffer = new ComputeBuffer(5, sizeof(int));
```

###７．（場合によっては、値を入れる）

```sample6.cs
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);
```

###８.GPU側への値の呼び出し。

```sample７.cs
compute_shader.Dispatch(shader_kanel, 1, 1, 1);
```

###９.GPUからの値の受け取り。

```sample８.cs
//sample6と合わせて
buffer.GetData(set_data);
```



#やる上で私が引っかかったこと。
###・Platform関係の設定
　特に、普段Androidなどを開発している場合などでEditorで実行しようとすると
　Errorが出ます。（以下のようなエラー）
　Platform does not support compute shaders
 これはAndroid等の開発を行っていて、Editorで実行しようとするとなります。

推測ですが、PCでの実行なのにAndroidの実行でやろうとしてるがサポートしてないからー
といった感じでしょうか

#サンプルコード全体
```シェーダー側.compute
RWStructuredBuffer<int> int_result;

[numthreads(4,1,1)]
void CSMain (uint3 id : SV_DispatchThreadID)
{
	int_result[id.x] += id.x;
}
```

``` C#コード.cs
    #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