上个月写了一篇使用像素shader返回累加信息的Trick:https://www.cnblogs.com/hont/p/9977401.html

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

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(, sizeof(int), ComputeBufferType.Append);
appendBuffer.SetCounterValue();
//定义了缓冲区长度为64*结构大小的appendBuffer. var consumeBuffer = new ComputeBuffer(, sizeof(int), ComputeBufferType.Append);
consumeBuffer.SetCounterValue();
consumeBuffer.SetData(new int[] { , , });
consumeBuffer.SetCounterValue();
//consume类型结构相当于栈,所以取到的第一个值是99。 computeShader.SetBuffer(kernelID, "appendBuffer", appendBuffer);
computeShader.SetBuffer(kernelID, "consumeBuffer", consumeBuffer);
computeShader.Dispatch(kernelID, , , );
//单个线程组的大小为8,定义了1个线程组。也就是说会返回8个数据。 var countBuffer = new ComputeBuffer(, sizeof(int), ComputeBufferType.IndirectArguments);
ComputeBuffer.CopyCount(appendBuffer, countBuffer, );
//通过这个方法拿到第一个数据。 int[] counter = new int[] { };
countBuffer.GetData(counter); int count = counter[]; Debug.Log("count: " + count); var data = new int[count];
appendBuffer.GetData(data); Debug.Log("data length: " + data.Length); for (int i = ; i < data.Length; i++)
{
Debug.Log(data[i]);
} consumeBuffer.Release();
consumeBuffer.Dispose(); appendBuffer.Release();
appendBuffer.Dispose(); countBuffer.Release();
countBuffer.Dispose();
}
}

compute shader:

#pragma kernel CSMain

AppendStructuredBuffer<int> appendBuffer;
ConsumeStructuredBuffer<int> consumeBuffer; [numthreads(,,)]
void CSMain (uint3 id : SV_DispatchThreadID)
{
if (id.x == )
{
int value = consumeBuffer.Consume();
appendBuffer.Append(value);
} if (id.x > )
{
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。

ComputeShader中Consume与AppendStructuredBuffer的使用的更多相关文章

  1. ComputeShader中Counter类型的使用

    接上一篇:https://www.cnblogs.com/hont/p/10122129.html 除了Append类型对应的Consume/AppendStructuredBuffer还有一个Cou ...

  2. 【原创翻译】初识Unity中的Compute Shader

    一直以来都想试着自己翻译一些东西,现在发现翻译真的很不容易,如果你直接把作者的原文按照英文的思维翻译过来,你会发现中国人读起来很是别扭,但是如果你想完全利用中国人的语言方式来翻译,又怕自己理解的不到位 ...

  3. 分享 rabbitMQ入门详解

    原文地址http://blog.csdn.net/cugb1004101218/article/details/21243927 目录(?)[-] rabbitMQ说明文档 rabbitMQ是什么 消 ...

  4. (转)RabbitMQ消息队列(九):Publisher的消息确认机制

    在前面的文章中提到了queue和consumer之间的消息确认机制:通过设置ack.那么Publisher能不到知道他post的Message有没有到达queue,甚至更近一步,是否被某个Consum ...

  5. RabbitMQ消息队列(九):Publisher的消息确认机制

    在前面的文章中提到了queue和consumer之间的消息确认机制:通过设置ack.那么Publisher能不到知道他post的Message有没有到达queue,甚至更近一步,是否被某个Consum ...

  6. RabbitMQ其他(八)

    1 RabbitMQ消息队列的小伙伴: ProtoBuf(Google Protocol Buffer) 什么是ProtoBuf? 一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序 ...

  7. RabbitMQ - Publisher的消息确认机制

    queue和consumer之间的消息确认机制:通过设置ack.那么Publisher能不到知道他post的Message有没有到达queue,甚至更近一步,是否被某个Consumer处理呢?毕竟对于 ...

  8. Python开源框架

    info:更多Django信息url:https://www.oschina.net/p/djangodetail: Django 是 Python 编程语言驱动的一个开源模型-视图-控制器(MVC) ...

  9. 在 .h 和 cpp 中查找 :grep consume ~/test/2016/AMQP-CPP/**/*.cpp ~/test/2016/AMQP-CPP/**/*.h -r

    :grep consume ~/test/2016/AMQP-CPP/**/*.cpp ~/test/2016/AMQP-CPP/**/*.h -r -w "whole" 匹配整个 ...

随机推荐

  1. 基于TFTP方式加载启动Linux内核

            一.软硬件平台 1.开发板:创龙AM3359核心板,网口采用RMII形式. 2.UBOOT版本:U-Boot-2016.05,采用FDT和DM. 3.交换芯片MARVELL的88E63 ...

  2. continue — Skip to the next iteration of a loop in a shell script

    continue — Skip to the next iteration of a loop in a shell script

  3. Django路由详解

    一.路由基础 1.路由url函数:路由自上而下进行匹配:url(正则路径,视图函数内存地址,默认参数,路由别名) 2.路由正则: 规定开始:^ | 规定结束:$ #url(r'index', view ...

  4. 版本控制系统-SVN(1)

    1.   SVN介绍 1.1.  简介 SVN(subversion),版本管理工具,与CVS一样,SVN是一个可跨平台的开源版本控制系统,Subversion管理随时间变化的数据.这些数据都被放置在 ...

  5. AE缺失Form Trapcode Form

    缺失Form 下载链接: trapcode套装插件2017下载_Trapcode系列十款插件汉化版[支持AE CC 64位] - 迷你下载 下载Trapcode就可以了,应该是TC里的 去新CG下插件 ...

  6. 牛客国庆集训派对Day4.B.异或求和(按位统计)

    题目链接 刷牛客一战到底做到的,感觉还挺有趣... \(Description\) 求给定\(n\)及序列\(A_i\),求\[\sum_{i\lt j\lt k}(A_i\oplus A_j)(A_ ...

  7. 摆脱CSS浏览器私有属性-moz, -ms, -webkit

    为了兼容各个浏览器之间的私有属性,前端开发人员在写css的时候需要给一些css属性添加多个私有前缀,非常麻烦.这里给大家分享一个简单的方法可以让你以后无需手动给CSS添加私有属性. -moz代表fir ...

  8. 老毛桃UEFI版u盘启动盘

    使用老毛桃制作UEFI启动盘 下载UEFI版本启动盘制作工具,打开官方网站http://www.laomaotao.org,当前显示页面右下下载UEFI版本.文章写作时最新版本为9.3. 使用教程见: ...

  9. sqlserver 为表添加一个自增主键

    alter table person add id int primary key identity(1,1) not null

  10. Oracle CPU使用率过高问题处理

    1.下载Process Explorer 2.打开Process Explorer,查看CPU使用情况最高的进程 3.双击该进程,查看详情 \ 4.    获取cpu使用最好的线程tid 5.     ...