博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ComputeShader中Consume与AppendStructuredBuffer的使用
阅读量:5879 次
发布时间:2019-06-19

本文共 2345 字,大约阅读时间需要 7 分钟。

上个月写了一篇使用像素shader返回累加信息的Trick:

后来无意中发现DX11/Compute shader有一类数据格式更适合这类操作。

 

c sharp脚本:

using System.Collections;using System.Collections.Generic;using UnityEngine;public class ComputeShaderTest : MonoBehaviour{    public ComputeShader computeShader;    void Awake()    {        //reference: https://answers.unity.com/questions/1035132/how-can-i-read-in-the-actual-elements-from-an-appe.html        var kernelID = computeShader.FindKernel("CSMain");        var appendBuffer = new ComputeBuffer(64, sizeof(int), ComputeBufferType.Append);        appendBuffer.SetCounterValue(0);        //定义了缓冲区长度为64*结构大小的appendBuffer.        var consumeBuffer = new ComputeBuffer(64, sizeof(int), ComputeBufferType.Append);        consumeBuffer.SetCounterValue(0);        consumeBuffer.SetData(new int[] { 97, 98, 99 });        consumeBuffer.SetCounterValue(3);        //consume类型结构相当于栈,所以取到的第一个值是99。        computeShader.SetBuffer(kernelID, "appendBuffer", appendBuffer);        computeShader.SetBuffer(kernelID, "consumeBuffer", consumeBuffer);        computeShader.Dispatch(kernelID, 1, 1, 1);        //单个线程组的大小为8,定义了1个线程组。也就是说会返回8个数据。        var countBuffer = new ComputeBuffer(1, sizeof(int), ComputeBufferType.IndirectArguments);        ComputeBuffer.CopyCount(appendBuffer, countBuffer, 0);        //通过这个方法拿到第一个数据。        int[] counter = new int[1] { 0 };        countBuffer.GetData(counter);        int count = counter[0];        Debug.Log("count: " + count);        var data = new int[count];        appendBuffer.GetData(data);        Debug.Log("data length: " + data.Length);        for (int i = 0; i < data.Length; i++)        {            Debug.Log(data[i]);        }        consumeBuffer.Release();        consumeBuffer.Dispose();        appendBuffer.Release();        appendBuffer.Dispose();        countBuffer.Release();        countBuffer.Dispose();    }}

 

 

compute shader:

#pragma kernel CSMainAppendStructuredBuffer
appendBuffer;ConsumeStructuredBuffer
consumeBuffer;[numthreads(8,1,1)]void CSMain (uint3 id : SV_DispatchThreadID){ if (id.x == 2) { int value = consumeBuffer.Consume(); appendBuffer.Append(value); } if (id.x > 2) { appendBuffer.Append(id.x); }}

 

 

传入的线程组是8,1,1。并且Dispatch只运行了一个线程组,所以每一次传入id的x值依次为0,1,2,3,4,5,6,7

在id是2的时候读consume里的值,所以第一个是99.

最终输出:99,3,4,5,6,7。

转载地址:http://fzcix.baihongyu.com/

你可能感兴趣的文章
微软同步发行Windows 10和Windows 10 Mobile系统更新
查看>>
Maven 传递依赖冲突解决(了解)
查看>>
Zeppelin的入门使用系列之使用Zeppelin运行shell命令(二)
查看>>
[Spark][Python]Spark Join 小例子
查看>>
form表单下的button按钮会自动提交表单的问题
查看>>
大战设计模式【11】—— 模板方法模式
查看>>
springBoot介绍
查看>>
Intellij IDEA 快捷键整理
查看>>
Redis 通用操作2
查看>>
11. Spring Boot JPA 连接数据库
查看>>
洛谷P2925 [USACO08DEC]干草出售Hay For Sale
查看>>
MapReduce工作原理流程简介
查看>>
那些年追过的......写过的技术博客
查看>>
小米手机解锁bootload教程及常见问题
查看>>
Python内置函数property()使用实例
查看>>
Spring MVC NoClassDefFoundError 问题的解决方法。
查看>>
CentOS 6.9配置网卡IP/网关/DNS命令详细介绍及一些常用网络配置命令(转)
查看>>
python基础教程_学习笔记19:标准库:一些最爱——集合、堆和双端队列
查看>>
C# 解决窗体闪烁
查看>>
CSS魔法堂:Transition就这么好玩
查看>>