【unity】ComputeShader的学习使用

ComputeShader

文章目录


一、学习链接

王江荣:Compute Shader的基础介绍与使用

用GPU代替CPU进行计算:

  1. 定义核函数:可以定义很多个,最终会在GPU中被执行
csharp 复制代码
#pragma kernel CSMain
  1. 定义纹理:RWTexture2D可读写,默认的Texture2D只可读
csharp 复制代码
RWTexture2D<float4> Result;
  1. 定义线程组,其中定义了线程的数量
csharp 复制代码
[numthreads(8,8,1)]
  1. uint3 id : SV_DispatchThreadID
    大佬博客讲的很详细,简而言之就是可以根据内置进行多线程处理每个像素,在dispatch时,根据纹理大小和线程数量进行设置线程组数量:dispatch(1024/8, 1024/8, 1)

二、案例学习

1.FallingSand

关键代码解析:

简而言之在ComputeShader里将每个像素根据RGB通道的不同进行设置为障碍和沙子,然后在核函数里判断是否能向下移动,如果遇到障碍物则加上水平位移。

csharp 复制代码
	if(p.x == 1)
	{
		//move down
		//向下移动
		int2 direction = int2( 0 , -1 );
		int2 pID_new = pID+direction;//*(10*p.y);
		float4 p_new = GetResultPixel(pID_new);

		//if not empty - move horizontal
		//若下一个像素不为空,那么将其随机水平位移
		if(p_new.x > 0 || p_new.z > 0)
		{
			//这里_Time类似一个随机数种子
			//sign函数将其约束到-1 至 1
			direction = int2(sign(random(float2(pID) + _Time)-0.5f) , -1 );
			pID_new = pID+direction;
			p_new = GetResultPixel(pID_new);
		}

		//if empty - assign
		//若为空则赋值
		if(p_new.x == 0 && p_new.z == 0)
		{
			Result[pID_new] = p;
			Result[pID] = float4(0,0,0,1);
		}
	}

2.Fluid_2D

相关推荐
小拉达不是臭老鼠6 小时前
Unity学习_ScriptableObject
学习·unity
Thomas_YXQ7 小时前
Unity无GC读取图片与网格完整方案
大数据·人工智能·unity·微信·产品运营
jiayong239 小时前
虚幻引擎 Unreal Engine 通俗指南
游戏引擎·虚幻
郝学胜-神的一滴11 小时前
中级OpenGL教程 008:精准控制高光光斑大小与强度
c++·unity·godot·three.js·图形学·opengl·unreal
avi911113 小时前
Unity 商业插件之(五)课外2 - Zenject的一些小Tips(学习备忘)
unity·游戏开发·团结引擎
元气少女小圆丶14 小时前
SenseGlove Nova 2+Unity开发笔记4
笔记·unity·游戏引擎
basketball61614 小时前
Go 语言从入门到进阶:6. 一文彻底吃透结构体(Struct)
开发语言·unity·golang
cheniie17 小时前
如何优化大景深场景光场渲染背景模糊问题
unity·光场渲染
jiayong2319 小时前
虚幻引擎是什么?用来做什么?
游戏引擎·虚幻
易知微EasyV数据可视化19 小时前
Web+游戏引擎模式:设计的跨界协同最优解 | 数字孪生实战训练营·设计篇
前端·经验分享·游戏引擎·数字孪生·空间智能