写这篇的缘由是最近老师给了一个UE4的工程,是一个海水模拟的Demo,实现了二十年前一篇paper的算法,paper的地址是:
http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.161.9102&rep=rep1&type=pdfciteseerx.ist.psu.edu不过由于我还不够熟悉UE4,加之UE4各种版本满天飞,不同插件基于不同版本开发实在混乱。。。老师给的工程跑不起来,但至少看看代码还是能知道在干啥的,于是尝试在Unity里复现一下这个工程。这篇文章主要介绍Unity Compute Shader的用法流程,而不是IFFT模拟海水的算法,因为受限于贫瘠的数学水平,目前我还没理解这个算法到底在干什么。。。
阅读此文前你应该知道
- 基本的Unity操作及编写C#脚本
- 一种Shader语言,GLSL / HLSL / Unity 的Shaderlab也行
阅读此文后你会了解
- 在Unity中使用Compute Shader的流程
- 使用Compute Shader时要注意的问题
此文环境
- Unity 2019.4.11f1
- Windows 10
什么是Compute Shader
这要从GPU开始说起。GPU相比于CPU的一个特点是它特化了向量、矩阵和浮点运算能力,以众多核心数和大显存来实现极高的并行程度从而完成光栅化流程渲染。因此,我们可以利用GPU的能力做一些别的事情,不是要它的完整光栅化流程,而是它的高性能浮点和向量运算能力。由此诞生了Compute Shader,即专注于运算的Shader。
使用Compute Shader的基本流程
要使用Compute Shader的能力,朴素的想法让我们关注三件事情:
- 如何进行数据传输,这包括把我要进行运算的数据传给Compute Shader和取出运算结果
- 如何编写Computer Shader里的具体运算指令
- 如何用C#脚本控制Compute Shader运行
下面就来分别讲述这三个事情
数据传输
如果你写过普通的shader,就知道传统光栅化管线的shader往往是对输入的texture等数据进行操作,结果输出一