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

  ComputeShader需要脚本来调用

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

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

  1. StructuctedBuffer<float> floatBuffer;
  2. RWStructuredBuffer<int> readWriteIntBuffer;
  3. struct VecMatPair
  4. {
  5. public Vector3 point;
  6. public Matrix4x4 matrix;
  7. }
  8. RWStructuredBuffer<VecMatPair> dataBuffer;
  1. /*
  2. * test.compute
  3. */
  4. #pragma kernel Multiply
  5. struct VecMatPair
  6. {
  7. float3 pos;
  8. float4x4 mat;
  9. };
  10.  
  11. RWStructuredBuffer<VecMatPair> dataBuffer;
  12.  
  13. [numthreads(,,)]
  14. void Multiply (uint3 id : SV_DispatchThreadID)
  15. {
  16. dataBuffer[id.x].pos = mul(dataBuffer[id.x].mat,
  17. float4(dataBuffer[id.x].pos, 1.0));
  18. }
  19.  
  20. /*
  21. * 调用test.compute的cs脚本
  22. */
  23. public ComputeShader shader;
  24.  
  25. void RunShader()
  26. {
  27. VecMatPair[] data = new VecMatPair[];
  28. VecMatPair[] output = new VecMatPair[];
  29.  
  30. //INITIALIZE DATA HERE
  31.  
  32. // 76 = 3个float + 4*4个float,buffer需要手动指定大小为多少个byte
  33. ComputeBuffer buffer = new ComputeBuffer(data.Length, );
  34. buffer.SetData(data);
  35.  
  36. int kernel = shader.FindKernel("Multiply");
  37. // 设置buffer
  38. shader.SetBuffer(kernel, "dataBuffer", buffer);
  39. shader.Dispatch(kernel, data.Length, ,);
  40.  
  41. // 和texture不一样,structured buffers需要明确的从GPU存储空间转移到CPU(性能消耗非常大,一般只有需要从shader中拉数据时才需要用到)
  42. buffer.GetData(output);
  43. }
  可以看出,对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. Xamarin.Forms移动开发系列2:创建和调试

    摘要 本文将介绍如何通过VS2019创建Xamarin.Forms应用程序,以及如何进行调试. 前言 本文介绍Xamarin.Froms应用程序的创建和调试. 开发环境 1.Visual Studio ...

  2. [LeetCode] 51. N-Queens N皇后问题

    The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two queens ...

  3. 《30天自制操作系统》笔记3 --- (Day2 上节)完全解析文件系统

    Day2 汇编语言学习与Makefile入门 本文仅带着思路,研究源码里关于文件系统的参数 关于day2主程序部分及更多内容,请看<30天自制操作系统>笔记 导航 发现学习中的变化 源码差 ...

  4. DataSet 反射转换成 List<T>

    /// <summary> /// DataSet转换成指定返回类型的实体集合 /// </summary> /// <typeparam name="T&qu ...

  5. find命令常用参数

    目录 -name -type -size -empty -inum -links -perm -user -group -atime -ctime -mtime -amin -cmin -mmin - ...

  6. html5 video获取实时播放进度的方法

    getvideoprogress(); function getvideoprogress() { setTimeout(function () { var vid = document.getEle ...

  7. [转帖]linux下网络监控神器"iptraf-ng"

    linux下网络监控神器"iptraf-ng" https://www.cnblogs.com/dupengfei/articles/iptraf-ng.html 优点:监控的网络 ...

  8. java线程锁基础

    定义运行方法 package com.company; // 包名import java.util.concurrent.locks.ReentrantLock;import java.util.co ...

  9. MySQL 中获取用户表、用户视图、用户表中列信息

    直接贴代码了: /// <summary> /// MySql 数据库维护中心 /// </summary> public class MySqlDbMaintenance:D ...

  10. ['1', '2', '3'].map(parseInt) 输出答案和解析

    根据题目可以了解到这道题主要考我们的是对map函数和parseInt函数的熟悉程序,所以我们先来了解这两个函数 map 根据MDN上对于map的解释:map() 方法创建一个新数组,其结果是该数组中的 ...