ComputeShader:
    GPGPU:General Purpose GPU Programming,GPU通用计算,利用GPU的并行特性。大量并行无序数据的少分支逻辑适合GPGPU。平台或接口:DirectCompute,OpenCL,CUDA等。
    定义:GPGPU编程,运行在GPU上脱离于常规渲染管线之外的程序,并且能输出数据的缓冲或贴图。
    特定:数学、并行化,不影响渲染结果。
    用途:大量并行少分支的数学运算很适合使用compute shader,缺点是数据在cpu和gpu之间传输很慢。

  ComputeShader需要脚本来调用

/*
* test.compute
*/
// main函数,一个compute shader多个kernal函数,使用时在脚本中手动指定调用哪一个
#pragma kernel CSMain // 声明一可读写贴图
RWTexture2D<float4> Result;
// numthreads:创建线程组的大小,也就是一个线程组包含多少个线程,下面的指令表示:指定每个线程组包含64个线程
// id:该线程所在的总的线程结构中的索引
[numthreads(,,)]
void CSMain (uint3 id : SV_DispatchThreadID)
{
Result[id.xy] = float4(id.x & id.y, (id.x & )/15.0, (id.y & )/15.0, 0.0);
} /*
* 调用test.compute的cs脚本
*/
public ComputeShader shader; void RunShader()
{
int kernelHandle = shader.FindKernel("CSMain"); RenderTexture tex = new RenderTexture(,,)
// 手动标记为可随机读写
tex.enableRandomWrite = true;
tex.Create(); // 把CPU的数据传到GPU(在不同的存储空间移动数据会产生延迟,使用时需要考虑优化)
shader.SetTexture(kernelHandle, "Result", tex);
// 指定线程组是如何划分的
shader.Dispatch(kernelHandle, /, /, );
}

  Structured Buffers:一种数据类型的一个数组,可以是浮点数、整数、结构体:

    StructuctedBuffer<float> floatBuffer;
RWStructuredBuffer<int> readWriteIntBuffer;
struct VecMatPair
{
public Vector3 point;
public Matrix4x4 matrix;
}
RWStructuredBuffer<VecMatPair> dataBuffer;
 /*
* test.compute
*/
#pragma kernel Multiply
struct VecMatPair
{
float3 pos;
float4x4 mat;
}; RWStructuredBuffer<VecMatPair> dataBuffer; [numthreads(,,)]
void Multiply (uint3 id : SV_DispatchThreadID)
{
dataBuffer[id.x].pos = mul(dataBuffer[id.x].mat,
float4(dataBuffer[id.x].pos, 1.0));
} /*
* 调用test.compute的cs脚本
*/
public ComputeShader shader; void RunShader()
{
VecMatPair[] data = new VecMatPair[];
VecMatPair[] output = new VecMatPair[]; //INITIALIZE DATA HERE // 76 = 3个float + 4*4个float,buffer需要手动指定大小为多少个byte
ComputeBuffer buffer = new ComputeBuffer(data.Length, );
buffer.SetData(data); int kernel = shader.FindKernel("Multiply");
// 设置buffer
shader.SetBuffer(kernel, "dataBuffer", buffer);
shader.Dispatch(kernel, data.Length, ,); // 和texture不一样,structured buffers需要明确的从GPU存储空间转移到CPU(性能消耗非常大,一般只有需要从shader中拉数据时才需要用到)
buffer.GetData(output);
}
  可以看出,对texture的处理不需要手动传回CPU,所以速度比compute buffer更快。
 
注意点:
    (1)OpenGL ES 3.1一次只能支持4个compute buffers
    (2)可以在Show complied code里面查看cs的版本,是cs_4_x还是cs_5_0等
 
参考:

Compute Shader基础的更多相关文章

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

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

  2. 【Unity Shader】Shader基础

    目录 Chapter3 Unity Shader 基础 Chapter3 Unity Shader 基础 概述 在Unity需要材质(Material)与Unity Shader配合使用来达到满意的效 ...

  3. 使用Compute Shader加速Irradiance Environment Map的计算

    Irradiance Environment Map基本原理 Irradiance Environment Map(也叫Irradiance Map或Diffuse Environment Map), ...

  4. 聊聊如何正确向Compute Shader传递数组

    0x00 前言 前一段时间去英国出差,发现Unity Brighton 办公室的手绘地图墙很漂亮,在这里分享给大家. 在这篇文章中,我们选择了过去几周Unity官方社区交流群以及UUG社区群中比较有代 ...

  5. Unity Shader 基础(4) 由深度纹理重建坐标

    在PostImage中经常会用到物体本身的位置信息,但是Image Effect自身是不包含这些信息的,因为屏幕后处其实是使用特定的材质渲染一个刚好填满屏幕的四边形面片(四个角对应近剪裁面的四个角). ...

  6. OpenGL Compute Shader靠谱例子及读取二进制Shader,SPIR-V

    学OpenGL以来一直苦恼没有像DX那样可以读取二进制Shader使用的方法,除去有时不想公开自己写的牛逼Shader的心理(虽然目前还从没写过什么牛逼的Shader), 主要是不用现场编译,加快读取 ...

  7. Compute Shader

    [Compute Shader] 1.Similar to regular shaders, compute shaders are Asset files in your project, with ...

  8. Unity Shader基础

    Unity Shader基础 先上代码,代码一般是这样的. void Initialization(){ //先从硬盘加载代码再加载到GPU中 string vertexShaderCode = Lo ...

  9. OpenGL 之 Compute Shader(通用计算并行加速)

    平常我们使用的Shader有顶点着色器.几何着色器.片段着色器,这几个都是为光栅化图形渲染服务的,OpenGL 4.3之后新出了一个Compute Shader,用于通用计算并行加速,现在对其进行介绍 ...

随机推荐

  1. Tableau 练习题

    1.练习一 1. 提出问题:对某个学校或者一个城市的教育水平进行评估,或者多个学校的教育水平进行比较 指标:学生考试成绩 根据考试成绩高低判断教育水平:影响因素:学生餐饮,从多个维度分析,各城市在不同 ...

  2. Educational Codeforces Round 59 (Rated for Div. 2) E 区间dp + 状态定义 + dp预处理(分步dp)

    https://codeforces.com/contest/1107/problem/E 题意 给出01字符串s(n<=100),相邻且相同的字符可以同时消去,一次性消去i个字符的分数是\(a ...

  3. cf1208G Polygons 欧拉函数

    链接 cf 给你两个正整数\(n\)和\(k\),询问在一个圆上你最少需要几个点构才能造出\(k\)个边数小于等于\(n\)的正多边形 思路 深受迫害,所以写的详细一点,不会请留言. 性质1 考虑加进 ...

  4. [LeetCode] 416. Partition Equal Subset Sum 相同子集和分割

    Given a non-empty array containing only positive integers, find if the array can be partitioned into ...

  5. pytorch 查看中间变量的梯度

    pytorch 为了节省显存,在反向传播的过程中只针对计算图中的叶子结点(leaf variable)保留了梯度值(gradient).但对于开发者来说,有时我们希望探测某些中间变量(intermed ...

  6. # Leetcode 14:Longest Common Prefix 最长公共前缀

    公众号:爱写bug Write a function to find the longest common prefix string amongst an array of strings. If ...

  7. Distributed and Parallel Computing

    Omega Network Model

  8. OPTIONS预检请求

    OPTIONS预检请求 背景:像后台发送一个post请求,出错,错误代码403(权限验证未通过),查看请求方法变成OPTIONS.检查请求头得知,当前请求token未带上,问题,为什么post请求变成 ...

  9. Angular中上传图片到分布式文件服务器FastDFS上

    使用步骤 1.上传下载需要的依赖 2.springmvc中配置多媒体解析器并加载 <!-- 配置多媒体解析器 --> <bean id="multipartResolver ...

  10. Elasticsearch Field Options Norms

    Elasticsearch 定义字段时Norms选项的作用 本文介绍ElasticSearch中2种字段(text 和 keyword)的Norms参数作用. 创建ES索引时,一般指定2种配置信息:s ...