转载请注明出处为KlayGE游戏引擎,本文的永久链接为http://www.klayge.org/?p=1892

上周末把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将会更干净,效率更高。