Unity 使用 GPU 計算,使用 ComputeShader + ComputeBuffer

如果你會看這篇文章,代表你玩 Unity 已經玩到很深入了,CPU 計算已經不能滿足你,這時你不得不把注意力轉到 GPU 身上。GPU 的介紹就不用我多說了,就是超越CPU的存在。如果用 Texture2D 來畫你想要的圖案速度會慢的驚人,如果你用 Shader ( GPU ) 來畫將會快上幾千倍,好了,唬爛就到此為止,我們回歸正題。

這是一個簡單 Unity 的 GPGPU 計算,使用 ComputeShader。將輸入的數字丟入GPU,然後乘以兩倍再傳回 CPU。你可以往下拉直接看結果圖,就明白我再說什麼了。

注意:ComputeShader 只能在 Dx11 的顯卡上執行,除了 Windows 7 + 以外,一些新型的 Android 設備也能跑,要看你設備的 GPU 有沒有支持 Dx11。我目前測過以下設備都能跑: 華為 P10 Plus ( CPU : 麒麟960,GPU : Mali-G71 MP8 )、Asus zenfone 3 Deluxe ( CPU : 驍龍821, GPU : Adreno 530 )。

C # :

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test : MonoBehaviour
{
    public ComputeShader shader;

    struct Data{
        public float A;
        public float B;
        public float C;
    }

    void Start ()
    {
        Data [] inputData = new Data[3];
        Data [] outputData = new Data[3];

        print ("輸入 --------------------------------------------");
        for(int i=0; i <inputData.Length; i++){
            inputData[i].A = i * 3 + 1;
            inputData[i].B = i * 3 + 2;
            inputData[i].C = i * 3 + 3;
            print (inputData[i].A + ", " + inputData[i].B + ", " + inputData[i].C);
        }

        // Data 有3個float,一個 float 有 4 Byte,所以 3 * 4 = 12
        ComputeBuffer inputbuffer = new ComputeBuffer(outputData.Length, 12);
        ComputeBuffer outputbuffer = new ComputeBuffer(outputData.Length, 12);

        int k = shader.FindKernel ("CSMain");

        // 寫入 GPU
        inputbuffer.SetData(inputData);
        shader.SetBuffer(k, "inputData", inputbuffer);

        // 計算,並輸出至 CPU
        shader.SetBuffer(k, "outputData", outputbuffer);  
        shader.Dispatch(k, outputData.Length, 1,1);
        outputbuffer.GetData (outputData);


        print ("輸出 --------------------------------------------");
        // 打印結果
        for(int i=0; i < outputData.Length; i++){           
            print(outputData [i].A + ", " + outputData [i].B + ", " + outputData [i].C);
        }        // 釋放
        inputbuffer.Dispose ();
        outputbuffer.Dispose ();
    }
}


ComputeShader :

#pragma kernel CSMain

struct Data{
    float A;
    float B;
    float C;
};

// 從 CPU 寫入進來的資料 ( CPU -> GPU )
StructuredBuffer<Data> inputData;

// outputData 之後會丟回 CPU ( GPU -> CPU )
RWStructuredBuffer<Data> outputData;

[numthreads(12,1,1)]
void CSMain (uint3 id : SV_DispatchThreadID)
{
    // 計算完丟回 CPU
    outputData[id.x].A = inputData[id.x].A * 2;
    outputData[id.x].B = inputData[id.x].B * 2;
    outputData[id.x].C = inputData[id.x].C * 2;
}

結果 :

 

————————————————
原文链接:https://blog.csdn.net/weixin_38884324/article/details/79284373

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
下面是一个简单的Unity Compute Shader示例,用于将输入纹理的红色通道值乘以一个常数系数,并将结果输出到目标纹理的绿色通道中: ``` // 声明输入和输出纹理 Texture2D inputTex; RenderTexture outputTex; // 声明Compute Shader ComputeShader computeShader; int kernelID; void Start() { // 获取输入纹理 inputTex = Resources.Load<Texture2D>("InputTexture"); // 创建输出Render Texture outputTex = new RenderTexture(inputTex.width, inputTex.height, 0, RenderTextureFormat.ARGB32); outputTex.enableRandomWrite = true; outputTex.Create(); // 获取Compute Shader computeShader = Resources.Load<ComputeShader>("ComputeShader"); kernelID = computeShader.FindKernel("CSMain"); // 设置纹理参数 computeShader.SetTexture(kernelID, "InputTex", inputTex); computeShader.SetTexture(kernelID, "OutputTex", outputTex); // 设置常数系数参数 float coefficient = 2.0f; computeShader.SetFloat("Coefficient", coefficient); // 计算输出 computeShader.Dispatch(kernelID, inputTex.width / 8, inputTex.height / 8, 1); // 显示输出 GetComponent<Renderer>().material.mainTexture = outputTex; } void OnDestroy() { // 释放Render Texture outputTex.Release(); } ``` 在这个示例中,我们首先声明了输入和输出纹理,以及Compute Shader和内核ID。然后,我们在Start函数中加载输入纹理,创建输出Render Texture,并获取Compute Shader。接下来,我们设置Compute Shader的纹理和常数系数参数,并计算输出。最后,我们将输出纹理设置为场景中的对象材质的主纹理,并在结束时释放输出Render Texture。 要使用Compute Shader,您需要将其保存为.compute文件,并将其放在Unity项目的Assets文件夹中。您还需要将您的Compute Shader添加到资源中,以便您可以在代码中加载它。请注意,Compute Shader只能用于支持Compute Shader 5.0或更高版本的显卡上运行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值