Compute Shader基础
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);
}
Compute Shader基础的更多相关文章
- 【原创翻译】初识Unity中的Compute Shader
一直以来都想试着自己翻译一些东西,现在发现翻译真的很不容易,如果你直接把作者的原文按照英文的思维翻译过来,你会发现中国人读起来很是别扭,但是如果你想完全利用中国人的语言方式来翻译,又怕自己理解的不到位 ...
- 【Unity Shader】Shader基础
目录 Chapter3 Unity Shader 基础 Chapter3 Unity Shader 基础 概述 在Unity需要材质(Material)与Unity Shader配合使用来达到满意的效 ...
- 使用Compute Shader加速Irradiance Environment Map的计算
Irradiance Environment Map基本原理 Irradiance Environment Map(也叫Irradiance Map或Diffuse Environment Map), ...
- 聊聊如何正确向Compute Shader传递数组
0x00 前言 前一段时间去英国出差,发现Unity Brighton 办公室的手绘地图墙很漂亮,在这里分享给大家. 在这篇文章中,我们选择了过去几周Unity官方社区交流群以及UUG社区群中比较有代 ...
- Unity Shader 基础(4) 由深度纹理重建坐标
在PostImage中经常会用到物体本身的位置信息,但是Image Effect自身是不包含这些信息的,因为屏幕后处其实是使用特定的材质渲染一个刚好填满屏幕的四边形面片(四个角对应近剪裁面的四个角). ...
- OpenGL Compute Shader靠谱例子及读取二进制Shader,SPIR-V
学OpenGL以来一直苦恼没有像DX那样可以读取二进制Shader使用的方法,除去有时不想公开自己写的牛逼Shader的心理(虽然目前还从没写过什么牛逼的Shader), 主要是不用现场编译,加快读取 ...
- Compute Shader
[Compute Shader] 1.Similar to regular shaders, compute shaders are Asset files in your project, with ...
- Unity Shader基础
Unity Shader基础 先上代码,代码一般是这样的. void Initialization(){ //先从硬盘加载代码再加载到GPU中 string vertexShaderCode = Lo ...
- OpenGL 之 Compute Shader(通用计算并行加速)
平常我们使用的Shader有顶点着色器.几何着色器.片段着色器,这几个都是为光栅化图形渲染服务的,OpenGL 4.3之后新出了一个Compute Shader,用于通用计算并行加速,现在对其进行介绍 ...
随机推荐
- 成神之Java之路
既然励志在java路上走的更远,那就必须了解java的路径.先看图 image.png 更加细化的细节如下 一: 编程基础 不管是C还是C++,不管是Java还是PHP,想成为一名合格的程序员,基本的 ...
- Linux 访问iphone 上的照片
下面的链接,就差测试安装ifuse 了,估计是没有什么问题的. https://www.dedoimedo.com/computers/fedora-22-iphone.html
- Python数据分析与爬虫
数据分析重要步骤: 1.数据获取 可以进行人工收集获取部分重要数据 可以在各个数据库中导出数据 使用Python的爬虫等技术 2.数据整理 从数据库.文件中提取数据,生成DataFrame对象 采 ...
- echarts 中 柱图 、折线图、柱图层叠
app.title = '折柱混合'; option = { tooltip: { trigger: 'axis', axisPointer: { type: 'cross', crossStyle: ...
- [LeetCode] 52. N-Queens II N皇后问题之二
The n-queens puzzle is the problem of placing nqueens on an n×n chessboard such that no two queens a ...
- 北漂不易,逆风前行[给想在北京工作的java同学们诚恳的建议!]
作为一个北漂程序员(java开发),从业6年,北漂十一年,走了不少弯路,也曾孤独彷徨,楼主今天特地总结了一些经验,希望能给大家(准备做北漂 或 北漂的朋友们)一点启发.从生活.专业和薪水这2个方向来分 ...
- [转]Visual Studio 2017各版本安装包离线下载、安装全解析
Visual Studio 2017各版本安装包离线下载.安装全解析 2017-3-10 11:15:03来源:IT之家作者:寂靜·櫻花雨责编:晨风评论:165 感谢IT之家网友 寂靜·櫻花雨的投 ...
- 使用ipop共享串口提高工作效率
串口登录后,点击共享连接 然后在另外一台电脑,使用Telnet打开共享的串口(两台电脑需要可以网络连接) IP地址为对端IP地址,端口号为对端设置的端口号,点击连接即可
- [Powershell]导出指定的定时计划任务
<# .NOTES =========================================================================== Created wit ...
- 使用WCF-SQL一次Insert多个表
在Visual Studio中新增生成项目 选择适配器类型 选择WCF-SQL适配器 创建连接选项 选择相应的存储过程 生成相应的消息架构