FTT 海面模拟(DirectX11)

本文详细介绍了使用DirectX11和计算着色器(ComputeShader)实现GPU模拟海洋波浪的过程,包括FFT函数、高斯随机数生成、波谱计算以及顶点数据的更新。通过调整参数控制波浪大小,并使用imgui进行交互式调整。代码示例展示了如何在HLSL中定义结构体、计算着色器的实现以及FFTWavesRender类的初始化、数据更新和绘制步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

计算着色器(Computer Shader)中可以使用线程组并行进行计算,很适合用来计算波浪(水面、地形等)的顶点数据。在学习完DirectX11 With Windows 计算着色器:波浪(水波)后,要求完成FTT 海面模拟,并且可以使用 imgui 调节参数控制波浪大小。

FFTWaves

在《【学习笔记】Unity 基于GPU FFT海洋的实现-理论篇》FFT函数:

其中, 

参数 是我们水平方向的坐标, t 是时间,函数 h 可以直接给我们返回在时间 t 时,

处的海面高度。 

被定义为

为波矢量, 是海平面的大小,  N 和 M 是我们采样离散点的数量。当然 N 和 M取值越大我们得到的波形就更加细节(叠加的波就更多),当然计算时间也会大大的增加。

我们只需要计算出频谱然后按照 函数就可以得到我们海面的高度,现在我们来看一下频谱公式 

 

g 是引力常数  

 是两个相互独立服从均值为0,标准差为1的高斯随机数。

是我们的方向波谱,方向波谱一般描述为 ,这和我们前面的参数不太一样,其实他们之间可以相互转换,有兴趣可以看Empirical Directional Wave Spectra for Computer Graphics这篇论文。 

 方向波谱是非定向波普 和方向拓展函数 的乘积

W 是我们前面提到的角频率, 是波矢量相对于风向的角度

在Simulating Ocean Water-Jerry Tessendorf 中使用到的非定向波谱为 ,而方向拓展函数为 ,他们的乘积就是

在我们的实现中风向拓展函数使用的不是 ,而是Donelan-Banner定向传播,这里就先不贴这个公式了,免得 显得公式太多....

以上FFT海面高度的公式,接下来是水平偏移

可以看到这和我们的高度函数基本一样,只是我们需要把频谱进行改变一下。这是对 X 和 Z 总体的描述,我们将其拆开就可以得到对 X 和 Z 单独的描述

中间的其实就是两个复数相乘。

HLSL

在上一部分了解到,我们需要获得每个波的角频率w波长k海平面的大小L.x、L.y、高斯随机数风向的角度和系统的时间t。此外,为了在计算着色器中计算imgui ,我们还需要知道列线程组的数目。知道了需要,我们就可以在FFTWaves.hlsli中定义结构体: 

struct FFTWave
{
    float g_WaveW;     // 角频率
    float g_WaveK;     // 波长
    float g_WaveX;   // 海平面的大小
    float g_WaveY;     // 海平面的大小
    float g_WaveR;     //高斯随机数
    float g_WaveI;     
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值