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,用于通用计算并行加速,现在对其进行介绍 ...
随机推荐
- div层的滑入滑出实例
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"><head runat=&quo ...
- control+shift + o热键冲突?????
不知道有没有宝贝跟我遇到一样的问题 就是 control +shift+o 热键冲突了 进过我的严密调查. 这是因为你用的是A卡. 只要你把A卡换成N卡就可以了, 但是因为我太贫穷了,只能 ...
- 第01组 Beta冲刺(1/5)
队名:007 组长博客: https://www.cnblogs.com/Linrrui/p/11985569.html 作业博客: https://edu.cnblogs.com/campus/fz ...
- 推荐一款手机清理工具App悟空清理
推荐一款手机清理工具App悟空清理 1 介绍 悟空清理是一款完全免费的手机加速与存储空间清理工具软件,强力去除顽固垃圾,使手机运行更畅快. 2 特色功能介绍 悟空在手,清理无忧!悟空清理,人人都在用的 ...
- kubernetes-harbor 私有仓库 帐号与密码 配置
如harbor地址: harbor.qing.cn #docker login harbor.classba.cn #cat /root/.docker/config.json | base64 ...
- SpringBoot集成Spring Security(7)——认证流程
文章目录 一.认证流程 二.多个请求共享认证信息 三.获取用户认证信息 在前面的六章中,介绍了 Spring Security 的基础使用,在继续深入向下的学习前,有必要理解清楚 Spring Sec ...
- (四)golang--注意事项
以.go为结尾: 执行入口是main()函数: 区分大小写: Go方法由一条条语句构成,每个语句后不需要加问号: Go编译器是一行行进行编译的,一行不能写多条语句: go语言定义的变量或者import ...
- 使用thanos管理Prometheus持久化数据
关于thanos的介绍可以参考这篇官方博客的翻译文档,本文不作部署操作介绍.下图是thanos的官方架构图,主要有5个组件: Query:可以近似看作是Prometheus的实现,用于采集其他组件的数 ...
- visual studio -- 调试时自动传递给exe入参
如果你写的main函数接受入参int main(int argc, char* argv[]),则可以 右键工程--属性--调试,在命令行参数中输入入参即可,这些字符串会被直接传递给exe.
- HDU 5047 Sawtooth 找规律+拆分乘
Sawtooth Think about a plane: ● One straight line can divide a plane into two regions. ● Two lines ...