zoukankan      html  css  js  c++  java
  • Unity AsyncGPUReadback 接口测试

    Unity2018新加入了该接口,可以做到异步RenderTexture->像素数据和异步的ComputeBuffer.GetData

    那么写了几个例子来测试下。

    1.RenderTexture->Texture2D

    异步:

    IEnumerator Start()
    {
        var rt = new RenderTexture(512, 512, 0);
        //Graphics.xxx...
        var req = AsyncGPUReadback.Request(rt);
        yield return new WaitUntil(() => req.done);
    
        var tex = new Texture2D(512, 512, TextureFormat.RGBA32, false);
        var colorArray = req.GetData<Color32>().ToArray();
        tex.SetPixels32(colorArray);
        tex.Apply();
    }

    同步:

    RenderTexture.active = rt;
    var tex = new Texture2D(512, 512, TextureFormat.RGBA32, false);
    tex.ReadPixels(new Rect(0, 0, 512, 512), 0, 0, false);
    tex.Apply();

    2.AsyncGPUReadback GetData

    cs:

    #pragma kernel CSMain
    
    struct TestData
    {
        float3 pos;
    };
    RWStructuredBuffer<TestData> MyData;
    
    [numthreads(8,1,1)]
    void CSMain (uint3 id : SV_DispatchThreadID)
    {
        MyData[id.x].pos = MyData[id.x].pos * 2;
    }

    异步:

    public class ComputeShaderAsyncRequest : MonoBehaviour
    {
        public struct TestData
        {
            public Vector3 pos;
        }
        public ComputeShader computeShader;
    
        IEnumerator Start()
        {
            var kernelID = computeShader.FindKernel("CSMain");
    
            var testData = new List<TestData>();
            for (int i = 0; i < 64; i++)
                testData.Add(new TestData() { pos = new Vector3(i, 0, 0) });
    
            var computeBuffer = new ComputeBuffer(testData.Count, 12);
            computeBuffer.SetData(testData);
            computeShader.SetBuffer(kernelID, "MyData", computeBuffer);
            computeShader.Dispatch(kernelID, 8, 1, 1);
            var request = AsyncGPUReadback.Request(computeBuffer);
            Debug.Log("frame1: " + Time.frameCount);//1
            yield return new WaitUntil(() => request.done);
            Debug.Log("frame2: " + Time.frameCount);//4
    
            var testDataArray = request.GetData<TestData>().ToArray();
            for (int i = 0; i < testDataArray.Length; i++)
                Debug.Log("i :" + i + "item: " + testDataArray[i].pos);
        }
    }

    同步:

    public class ComputeShaderAsyncRequest_Sync : MonoBehaviour
    {
        public struct TestData
        {
            public Vector3 pos;
        }
    
        public ComputeShader computeShader;
    
        void Start()
        {
            var kernelID = computeShader.FindKernel("CSMain");
    
            var testData = new List<TestData>();
            for (int i = 0; i < 64; i++)
                testData.Add(new TestData() { pos = new Vector3(i, 0, 0) });
    
            var computeBuffer = new ComputeBuffer(testData.Count, 12);
            computeBuffer.SetData(testData);
            computeShader.SetBuffer(kernelID, "MyData", computeBuffer);
            computeShader.Dispatch(kernelID, 8, 1, 1);
            var array = new TestData[testData.Count];
            computeBuffer.GetData(array);
            for (int i = 0; i < array.Length; i++)
                Debug.Log("i :" + i + "item: " + array[i].pos);
        }
    }
  • 相关阅读:
    unity小记
    Animator 设置动画效果
    Animation(动画效果)
    蜜蜂游戏 小结
    unity 协同
    camera render texture 游戏里的监控视角
    Mybatis框架 第一天
    BOS项目 第12天(总结)
    BOS项目 第11天(activiti工作流第三天,流程实例管理、项目中的用户和角色同步到activiti的用户和组表、设计物流配送流程、启动物流配送流程、组任务操作(查询、拾取)、个人任务操作(查询、办理))
    BOS项目 第10天(activiti工作流第二天,流程变量、组任务、排他网关、spring整合activiti、项目中实现流程定义管理)
  • 原文地址:https://www.cnblogs.com/hont/p/11351273.html
Copyright © 2011-2022 走看看