思考メモ:ComputeShader1

(この記事は何も知らない素人が気になった記事のソースコードを読む記事です…学習していく過程を残すという意味で思考順に掲載していきます)

[Unity]最もシンプルなコンピュートシェーダー | notargs.com http://wordpress.notargs.com/blog/blog/2015/01/26/unity%E6%9C%80%E3%82%82%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%81%AA%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%83%88%E3%82%B7%E3%82%A7%E3%83%BC%E3%83%80%E3%83%BC/

をコピペしてみた。が、何の処理やってるのか全然わからない、、

これがわかりやすかった、自分なりの理解の仕方をメモ

  • (ComputeShader内)
    #pragma kernel CSMain

    • カーネルの処理を記載した関数を指定する
      • この下でvoid CSMain(){処理内容} を書く
  • (スクリプト内)
    ComputeShader.Dispatch()

    • コンピュートシェーダーを実行する
    • 第一引数は処理するカーネルを指定する、が、カーネルが一個しかないなら「0」と書けばよい
    • SV_DispatchThreadID の算出
      • DispatchThreadIDのx座標=
        • 実行するグループのx座標 * そのグループの中の実行するスレッドのx座標
        • y,zについても同様
        • こうすることで、3次元×3次元の値は本来数字6つ使うところ3つで表現できる

Unity : ComputeShader のシンプルなサンプル(2)

  • テクスチャが512 × 512で、スレッドを8×8で指定するとき、
    必要なグループ数はそれぞれ 512 / 8 = 64

で、最初の記事に戻る

  • CPU側
    • void ResetRWTexture()
      • スクリーンと同じ解像度を持つRenderTextureを作る
    • computeShader.Set~~
      • 下記4つをGPU側に送信
        • 書き込み先のテクスチャ
        • テクスチャの解像度(2次元)
        • 経過時間
        • マウスポインタの位置
      • computeShader.Dispatch();
        • GPU側で8x8x1スレッドで処理するので、グループを解像度/8している
  • GPU側
    • uint3の.xyってなに?
    • float2 pos = (dtid.xy / Resolution.xy – 0.5);
      • 0~1の範囲の小数で今処理してる位置を指定する
      • colorが0~255ではなく0~1だから?
    • // 半径0.2の円をobjPos座標に描く
      color.rgb += 0.001 / (abs(length(objPos – pos) – 0.2));

      • ここがつまづきポイント
        • 今のposがobjPosから-0.2離れた位置に近いほど白くなる
          • 0で割ってもエラーにならないらしい
        • length(円の中心objPosと、描画ピクセルposの距離を取る)
        • あたまがよすぎる、、、

 

 

 

Please follow and like us:
memex
memex
memex サイト管理者:ぴぼ