csharp コンピュートシェーダ的HelloWorld

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了csharp コンピュートシェーダ的HelloWorld相关的知识,希望对你有一定的参考价值。

#pragma kernel CSMain

#define ThreadBlockSize 12
// RWが頭につくことで読み書き可能なバッファとして扱うことができる
RWStructuredBuffer<float> Result;

[numthreads(ThreadBlockSize, 1, 1)]
void CSMain (uint id : SV_DispatchThreadID)
{
    // 1度加算する並列処理
    Result[id] += 1;
}
using UnityEngine;

/// <summary>
/// 毎フレーム1度ずつX軸回転するキューブ
/// </summary>
public class ComputeCubes : MonoBehaviour
{
    /// <summary>
    /// スレッド
    /// </summary>
    private const int ThreadBlockSize = 12;

    /// <summary>
    /// コンピュートシェーダ
    /// </summary>
    [SerializeField]
    private ComputeShader _computeShader;

    /// <summary>
    /// コンピュートバッファ
    /// </summary>
    private ComputeBuffer _buffer;

    /// <summary>
    /// 生成個数
    /// </summary>
    private int _cubeCount = 10000;

    /// <summary>
    /// キューブ参照
    /// </summary>
    private GameObject[] _cubes;

    /// <summary>
    /// 各キュー部の角度を格納配列
    /// </summary>
    private float[] _angles;

    /// <summary>
    /// カーネルID
    /// </summary>
    private int _mainKernel = 0;

    void Start()
    {
        // キューブGameObject作成
        _cubes = new GameObject[_cubeCount];
        _angles = new float[_cubeCount];
        for (int i = 0; i < _cubeCount; i++)
        {
            var cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
            // キューブをランダムに初期配置
            float len = 20f;
            cube.transform.localPosition =
                new Vector3(Random.Range(-len, len), Random.Range(-len, len), Random.Range(-len, len));
            _cubes[i] = cube;
        }

        // カーネルID取得
        _mainKernel = _computeShader.FindKernel("CSMain");

        // コンピュートバッファの作成
        _buffer = new ComputeBuffer(_cubeCount, sizeof(float));
        // シェーダとバッファの関連付け
        _computeShader.SetBuffer(_mainKernel, "Result", _buffer);
        // バッファにデータをセット
        _buffer.SetData(_angles);
    }

    void Update()
    {
        // GPU並列処理実行
        int threadGroupX = (_cubeCount / ThreadBlockSize) + 1;
        _computeShader.Dispatch(_mainKernel, threadGroupX, 1, 1);

        var data = new float[_cubeCount];
        // 更新結果を取得
        _buffer.GetData(data);

        for (int i = 0; i < _cubeCount; i++)
        {
            float result = data[i];
            _angles[i] = result;
            // キューブをぐるぐるさせる
            _cubes[i].transform.localEulerAngles = new Vector3(_angles[i], 0, 0);
        }
    }

    private void OnDestroy()
    {
        _buffer.Release();
    }
}

以上是关于csharp コンピュートシェーダ的HelloWorld的主要内容,如果未能解决你的问题,请参考以下文章

c_cpp 的HelloWorldコンピュートシェーダ

c_cpp [失败例]コンピュートシェーダで大量の立方体を回す

[日文]中国語のコンピュータ用語を紹介する記事

python 「実践コンピュータビジョン」7章画像検索の読书会用コード

golang ツタンカーメン机器人(TUTコンピュータクラブ2015年度夏合宿成果)

csharp シェーダのコンパイル部分コード