位置: 编程技术 - 正文

unity3d 从零开始compute shader(unity3d从入门到精通)

编辑:rootadmin
开始用compute shader我喜欢vertex/fragment shaders的简单,他们只是做一件事(把顶点和颜色输出到屏幕上去),他们做得非常好,但是有时这种简单限制了你,当你的cpu拼了命的循环那些矩阵,算出并储存在贴图上。。。Compute Shader 解决了这个问题,我将在今天说明它的基础,我将通过一个unity自己的例子告诉你,使用structured buffer的数据在compute shader中工作 Compute Shader能用来控制粒子群的位置什么是compute shader?简单地说, compute shader是一个在GPU中执行的程序,不需要操作网&#;mesh和贴图texture数据,在OpenGL或DirectX存储空间中工作(不像OpenCL有自己的存储空间),并且能输出数据的缓冲或贴图,跨线程的执行分享存储。现在unity只支持DirectX的compute shader,如果等到了OpenGL4.3,苹果mac用户也能用他们了。这意味着这是一个仅用于windows的教程。如果不是windows的机器,也许会没有用。用了它有什么好处与坏处?两个词:数学与并行化。任何问题都包含相同的(没有条件转移conditional branching)计算对于每一个元素在数据中的设置都是完美的。在GPU中,你进行的计算越多,越有好处。条件转移conditional branching确实降低你的性能,因为GPU不能做这个不能达到最佳,但是这和写一个vertex和fragment shaders没有区别,所以如果你有过写shader的经历这将非常简单。但是它也有潜在问题。从GPU中获取存储到你的CPU中需要时间,当compute shader工作时这就像是你的瓶颈。确保优化你的内核kernel 去工作在最小的缓存可以减轻这个问题,但是这个问题将永远不会消除。懂了?那我们开始吧当我们使用DirectX时,unity的compute shader需要使用HLSL编程语言,但是他几乎不能辨别其他shader语言,所以如果你能写CG或者GLSL你也会用好的。你需要做的第一件事是创建一个新的compute shader。Unity的工程面板中有一个这个选项(博主注:Project->Create->Compute Shader),这一步很简单。如果你把它打开,你会看到像下面这样自动产生的代码(取消了注释)这是一个搞清楚compute shader的好例子,所以我们一行一行的看这指定了这个程序的入口函数(compute shader的main函数),一个compute shader能定义许多函数,你能从脚本中随意调用。

推荐整理分享unity3d 从零开始compute shader(unity3d从入门到精通),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:unity3d基础操作,unity3d 编程,unity3d从入门到精通,unity3d2019教程,unity3d基础操作,unity3d 编程,unity3d基础操作,unity3d快速入门,内容如对您有帮助,希望把文章链接给更多的朋友!

unity3d 从零开始compute shader(unity3d从入门到精通)

这声明了一个变量,它包含的数据是shader程序将要用到的。我们不需要用到网&#;mesh数据,你需要像这样明确的声明,你的compute shader需要写入读出什么数据。数据类型名前面的“RW”指定了shader可以进行读写操作。

这一行指定了compute shader创建的线程组的大小。GPU利用了大量的并行处理使得GPU创建的一些线程可以同时运行。线程组指定如何组织线衍生程们 spawned threads,在上面的代码中,我们指定我们想要每组线程组包含个线程,可以使用像一个二维数组。决定你线程组的最佳大小是个复杂的问题,与你的目标硬件有很大关系。一般的,把你的GPU想成一些流处理器,每一个都能同时执行X个线程,每个处理器同一时间运行一个线程组,所以理论上你想你的线程组去包含x个线程来利用处理器。我用这个&#;来准备控制他们,所以而不是建议怎样更好地去设置这些&#;,想了解更多你可以去google。放置shader是一个很普通的代码。核心函数决定--基于线程的id执行函数,哪一个像素应该被使用, 并且在result缓冲中写入一些数据实际运行shader显然我们不能把compute shader加入到网&#;中导出运行,尤其是它没有网&#;数据。compute shader实际上要用脚本来调用,看起来像这样:这里标记了一些东西。首先在你创建renderTexture前先设置了enableRandomWrite标记。这使你的compute shader 有权写入贴图。如果你不设置这个标记你就不能在你的shader中作为一个写入目标使用贴图。然后我们需要一种方法来确定我们想要在compute shader中调用什么函数。FindKernel函数使用一个字符串类的名字,与我们一开始在compute shader中设置的核心kernel的名字相同。记住,在一个compute shader文件中, 可以有多个核心kernel (函数)。ComputeShader.SetTexture让我们把CPU的数据传到GPU。在不同的存储空间中移动数据会在你的程序中产生延迟,你传&#;越多延迟越明显。对于这个原因,如果你想每帧都执行compute shader,你需要优化实际操作的数据。三个整数通过Dispatch指定需要产生的线程组的数量,在compute shader中 numthreads块中指定取消每个线程组的大小,所以在上面的例子中,我们产生的线程的总数是:*个线程组 * 个线程每组 = 个线程。这结束了相当于在render texture中的一个线程一个像素,使场景核心函数调用只能操作一个像素。所以现在我们知道写一个compute shader能操作贴图内存,让我们看看我们能让他去做什么。 Structured Buffers非常惊异修饰贴图数据很像vert/frag shader,是时候释放我们的GPU让他操作数据了,是的,这是可行的,听起来非常好。一个Structured Buffer 只是一种数据类型的一个数组的数据。可以设置conditional branching为浮点或整型。你可以在comepute shader中像这样声明:数据类型也可以是结构体,在本文的第二个例子会讲到在我们的例子中,我们将通过我们的compute shader中的一组点,每个都有一个矩阵被我们变换。我们可以用两个分开的缓冲完成它(一个是Vector3s另一个是Matrix4x4s), 但是将一个点或矩阵在一个结构体中,处理起来会很简单我们也在shader中需要定义数据类型,但是HLSL没有Matrix4x4 或 Vector3类型。然而,它有相同的存储布局的数据类型。我们的shader结束时看起来是这样的:注意我们的线程组现在组织成一个空间的数组。这对于线程组的维数没有性能影响,所以你可以在你的程序中自由的选择。在我们刚才的贴图例子中,在一个脚本中构建一个structured buffer有点困难。对于一个buffer,你需要指定在这个buffer中一个元素要多大的字节,并且储存信息和数据本身一起在一个compute buffer物体中。在我们的结构体例子中,字节数大小仅仅是我们存储的 float&#;的大小(3个vector,个matrix)乘以一个float的大小(4bytes),对于在一个结构体中一个总数达到bytes。在compute shader 中设置他看起来是这样的:现在我们需要让这个改进数据回到一个&#;式,使我们能在脚本中使用。不像我们上面renderTexture的例子,structured buffers 需要明确的从GPU的存储空间中被转移到CPU中。在我的经验中,当使用compute shader时,你要注意这是一个最大的性能消耗,我找到的只有一种方法来减轻它是优化你的缓冲,所以他们要尽可能的小,直到存在可用,并且只有从你的shader中把拉数据出来时你才完全需要它。得到数据到你的CPU中的实际的代码很简单。你需要的只是一个有着相同的数据类型で数组并且大小和写入缓冲的数据相同,如果我们改进上面的脚本去写数据到一个第二数组,看起来像是这样:你需要看profiler去得到你操作的最大的数据移动到CPU的的精确时间,但是我发现这么做确实非常消耗原文链接:

【Unity3d】unity3d的www和java服务器进行http通信 MD5校验时含中文不一致 unity3d的www类和java服务器进行http通信时,在验签时使用MD5加密时,如果原文含中文会和服务器上加密的不一致,碰到此种情况的朋友,希望你能得到帮助

【转】基于高通AR SDK的Demo总结(二)——异步加载场景 注意上边大大的转字,我发现MOMO以前写的异步加载的文章很能说明问题,也就不在这卖弄我这点浅薄的知识量了,转来给大家看,当然请支持原创作者

Embedded statement cannot be a declaration or labeled statement 在Unity3D里创建一个脚本,然后进行编辑。在某种情况下Monodevelop崩了,直接强制关闭。然后再打开这个脚本时,提示加载原始文件或加载自动保存文件

标签: unity3d从入门到精通

本文链接地址:https://www.jiuchutong.com/biancheng/383657.html 转载请保留说明!

上一篇:Metaio in Unity3d 教学--- 四.再谈谈图片扫描之tracking配置文件

下一篇:【Unity3d】unity3d的www和java服务器进行http通信 MD5校验时含中文不一致(unity-3d)

  • 动态市盈率与静态市盈率区别百度百科
  • 待办事项没有印章怎么办
  • 公司从业人员包括老板吗
  • 计提的坏账准备可以税前扣除吗
  • 应纳税所得额超过36000至144000
  • 房地产企业预收款预缴增值税
  • 房产过户需要交个人所得税吗
  • 季度流动比率怎么算
  • 去年漏记了收入,可以记今年吗
  • 转让土地使用权一般计税方法
  • 出现销项负数
  • 没收租赁保证金开什么内容的发票
  • 可供出售交易性金融资产申报表怎么填
  • 银行账户销户时需要收回开户许可证吗
  • 赠送的固定资产需要计提折旧吗?
  • 营改增后房地产企业增值税税率
  • 代扣代缴个人所得税手续费是否缴纳增值税
  • 国税局代开增值税专票要哪些资料?
  • 公司收到保险公司的理赔款怎么做分录
  • 企业出租包装物收取的押金应通过其他应收款账户核算
  • 实际缴纳的增值税税额怎么算
  • 应收账款核销会计处理
  • 汇算清缴前可以更改去年的账吗
  • 在银行买理财产品
  • xp从做系统
  • 存货跌价准备会影响利润吗
  • 固定资产清理应交税费怎么算
  • 公司向股东借款合法吗
  • 深入浅出stm8
  • 缴纳社保费现金流量?
  • xwizard.exe是什么
  • Nginx-http-flv-module流媒体服务器搭建+模拟推流+flv.js在前端html和Vue中播放HTTP-FLV视频流
  • 财务费用为什么是负数表示
  • 微信小程序封掉了怎么办
  • thinkphp with
  • 汽车4s店一般会摆放什么小零食
  • 出差补贴要扣税吗
  • 折扣和佣金合法的两个条件是什么?
  • 土地作为无形资产摊销年限
  • 交易性金融资产的账务处理
  • 港资企业属于什么性质
  • 进项税额转出分录怎么写,附加的原始凭证是什么
  • 一般纳税人已交税金账务处理
  • 计提借款利息怎么算
  • 资金账簿的计税依据
  • 自产自用的产品增值税怎么算
  • 电子承兑汇票是24小时签收吗
  • 主营业务收入一定要结转成本吗
  • 购买需要安装的生产设备会计分录
  • 集团管理费收入是否纳税
  • 累计折旧怎么算出来
  • 预支款怎么做现金账
  • 租金收入分摊政策规定
  • sqlserver 教程
  • win7系统设备管理器其他设备有个未知设备叹号
  • Windows Server 2008与2012建立林信任详细步骤
  • linux 设置文件系统
  • win8系统开机界面
  • Win10 TH2正式版偷偷恢复/篡改成对应的预装应用
  • win1021h2版本千万别更新
  • win8开始菜单变为win10
  • linux的命令行怎么打开
  • win10系统下怎么将腾讯qlv格式转换mp4格式?
  • ExtJS Ext.MessageBox.alert()弹出对话框详解
  • node与js的区别
  • perl中sub
  • 安卓炫酷壁纸
  • python数据结构教程
  • python+django
  • three.js 教程
  • jQuery autoComplete插件两种使用方式及动态改变参数值的方法详解
  • 简单的横向棱纹魔杖
  • 一次$.getJSON不执行的简单记录
  • each和each
  • 在python程序中变量名不能用
  • 浅析是什么意思
  • 上海市税务官方网站网址
  • 个人进口关税税率
  • 什么是解放思想?请阐述解放思想和实事求是之间的关系
  • 实名办税有什么作用
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设