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. RHEL7 安装Docker-CE

    rhel7官方有源可以直接使用,前提是需要订阅, 参考地址 通过添加CentOS7 源,进行安装: 通过添加CentOS7 源,进行安装 参考博客 安装container-selinux依赖(Requ ...

  2. [NOI2019]回家路线(最短路,斜率优化)

    终于把这鬼玩意弄完了-- 为什么写的这么丑-- (顺便吐槽 routesea) 最短路的状态很显然:\(f[i]\) 表示从第 \(i\) 条线下来的最小代价. 首先明显要把那个式子拆开.直觉告诉我们 ...

  3. SpringBoot集成Spring Security(7)——认证流程

    文章目录 一.认证流程 二.多个请求共享认证信息 三.获取用户认证信息 在前面的六章中,介绍了 Spring Security 的基础使用,在继续深入向下的学习前,有必要理解清楚 Spring Sec ...

  4. ASP.NET Core基于微软微服务eShopOnContainer事件总线EventBus的实现

    这个EventBus的实现是基于微软微服务https://github.com/dotnet-architecture/eShopOnContainers项目的,我把它从项目中抽离出来,打包成nuge ...

  5. hbase 查看元数据

    package com.jason.lala.pipe.dbinfo import com.jason.lala.common.query.option.HbaseOptions import org ...

  6. 浙大版《C语言程序设计(第3版)》题目集 --总结

    浙大版<C语言程序设计(第3版)>题目集 此篇博客意义为总结pta上浙大版<C语言程序设计(第3版)>题目集所做题目的错误点,心得体会. 1.练习2-10 计算分段函数[1] ...

  7. 我的周记9——"所以快乐才是真谛"

    七月又名:巧月.瓜月.霜月.相月.凉月.初商.肇秋.初秋.首秋.早秋.新秋.上秋.孟秋.夷则.申月等. 你好七月 ,想起大学的时候我在校园的点歌台点了一首歌,歌名是July . 七月一号,新的一月,新 ...

  8. VHR配置数据库开发环境

    一,vhr项目宏观分析 目的:实现机关和事业单位的人事管理信息系统. 软件使用的对象:面向机关和事业单位内人事信息管理人员和在职开发人员. [架构选型] vhr面向的群体范围并不大,并非属于互联网应用 ...

  9. centos7安装pyenv

    一.安装pyenv: 1.>安装依赖包: yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel ...

  10. Password file not found:.../jmxremote.password

    jmxremote.password 在jdk/jre/lib/management/下,jmxremote.password.template复制,去掉.template后缀 在配置JMX远程访问的 ...