csharp 大量の立方体を回すコンピュートシェーダ

Posted

tags:

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

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 大量の立方体を回すコンピュートシェーダ的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

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

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

text 团结ちゃんシェーダ肌部分のフラグメントシェーダに自分なりのコメントを入れたもの