14
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-06-17

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

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

#開発環境
Unity5.6.1f
VisualStudio2015Pro(Comminityでもたぶん問題ない)

もしくは
Unity2017.1f
VisualStudio2017Comminity

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

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

・CPU側のスクリプトの作成
5.シェーダーの関数へのアクセスの確保
6.計算の受け渡しのできる入れ物の作成。
7.(場合によっては、値を入れる)
8.GPU側への値の呼び出し。
9.GPUからの値の受け取り。

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

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

sample1.compute

#pragma kernel CSMain //...2

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

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

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

sample2.compute

RWStructuredBuffer<int> int_result;

###4.(場合によっては、値を受け取るだけの変数の宣言)
普通に宣言するだけ。

sample3.compute
int num;

###5.シェーダーの関数へのアクセスの確保

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

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

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

###7.(場合によっては、値を入れる)

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);

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

sample7.cs
compute_shader.Dispatch(shader_kanel, 1, 1, 1);

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

sample8.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

14
16
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?