基于Pixel Shader的FFT已经完成
转载请注明出处为KlayGE游戏引擎,本文地址为http://www.klayge.org/2012/04/12/%e5%9f%ba%e4%ba%8epixel-shader%e7%9a%84fft%e5%b7%b2%e7%bb%8f%e5%ae%8c%e6%88%90/
上周末把GPU Gems 2里的GPU FFT在KlayGE里实现了一下,经过优化和调整,昨晚已经进入KlayGE的开发版本中。完整的FFT Lens Effects也会很快集成进去。
这里用到的是那篇文章中提到的方法1,因为经过测试,方法2在现代GPU上速度不如方法1。我做的改进是把原来的3张查找表合并成1张,并都用 16F而不是32F的格式保存输入输出数据。在GTX580上,512×512的数据量,PS版本的FFT花费0.94ms左右,能达到CPU FFTW的75倍速度。但即便如此,对于lens effect那样的应用来说还是有点慢。所以接下去考虑用Compute Shader来实现FFT,pass数会减少到1/3。PS每次处理2个数,512×512需要log(512) + log(512) = 18个pass;CS每次可以处理8个数,所以只要6个pass。在Ocean的例子里有个CS4的FFT,需要多两个texture和buffer互转 的pass。CS5的FFT将会更干净,效率更高。