本文公式的推导、FFT原理实现以及知乎上某图片的引用均来自此【学习笔记】Unity 基于GPU FFT海洋的实现-理论篇 - 知乎 (zhihu.com)
根据上面的学习笔记可知,FFT的实现经过三个阶段,分别是:
生成频谱--->IDFT(逆离散傅里叶变换),得到偏移图--->法线、泡沫纹理,渲染
主要流程如下:可见,首要的事情是生成高度频谱。
第一阶段之生成频谱:
生成高度频谱的公式如下:
可见,要想得到高度频谱,我们不仅需要高斯随机数,还需要phillips频谱(方向波谱),其中公式中的k箭头是波长向量,k是波长向量的模。最后,我们就可以根据高度频谱生成对应的x\z位移频谱。
两个高斯随机数是互相独立服从均值为0,标准差为1的随机数。
下图是高斯随机数与phillips频谱生成高度频谱的流程。
如下是根据高度频谱实现FFT海浪模拟的全部过程。
第二阶段之使用IDFT:
利用IDFT由频谱图生成偏移图的过程。其中dx\dz\dy就是偏移图,displacement是偏移图合成的偏移纹理。
FFT的推导
根据推导可知,我们需要蝶形运算,并且采样点(或者说波数)是2的整数次幂。同时需要注意的是,蝶形运算会顺序输入、倒序输出,倒序输入、顺序输出。所以要采用Stockham算法来实现顺序的输入与输出。
快速傅里叶变换(FFT)——有史以来最巧妙的算法?_哔哩哔哩_bilibili的FFT推导理解:
1.n阶多项式由n+1个点来确实系数(这个由范德蒙行列式证明)
2.两个n阶多项式相乘得到n^2阶行列式,通过这种办法我们可以从系数表示法到值表示法,再到系数表示法得到n^2行列式。前者转化用DFT,后者用IDFT。
3.根据奇偶性可省去一半的计算量
4.用复数来解决平方后值为正而无法利用奇偶性减少计算量的问题
第三阶段之泡沫的生成及海面渲染: