基于时间t生成来自初始光谱的实时海浪的运动

时间:2015-03-17 23:46:57

标签: math graphics glsl fft ifft

我花了大约一个星期左右使用gerstner波渲染一个简单的海洋但是有平铺问题,所以我决定开始“正确”渲染它们并将我的脚趾浸入使用iFFT渲染高度场的阴暗水域中

有很多论文解释了基本要点 -

1)计算频谱

2)使用它来创建一个高度域,使用ifft从频域转换到空间域 - 动画时间t

自从这次旅程开始以来,我已经了解了复杂平面,复指数方程,更详细的FFT等内容,但是在创建初始光谱的初始步骤之后(渲染了带有均值的guassian数字的纹理) 0和sd为1,由菲利普斯光谱过滤)我仍然完全失去了。

我在这里创建初始数据的代码(GLSL):

float PhillipsSpectrum(vec2 k){
  //kLen is the length of the vector from the centre of the tex
  float kLen = length(k);
  float kSq = kLen * kLen;

  // amp is wave amplitude, passed in as a uniform
  float Amp = amplitude;

  //L = velocity * velcoity / gravity
  float L = (velocity*velocity)/9.81;

  float dir = dot(normalize(waveDir),normalize(k));

  return Amp * (dir*dir) * exp(-1.0/(kSq * L * L))/ (kSq * kSq) ;
}

void main(){

   vec3 sums;

   //get screenpos - center is 0.0 and ranges from -0.5 to 0.5 in both
   //directions
   vec2 screenPos = vec2(gl_FragCoord.x,gl_FragCoord.y)/texSize - vec2(0.5,0.5);

   //get random Guass number
   vec2 randomGuass = vec2(rand(screenPos),rand(screenPos.yx));

   //use phillips spectrum as a filter depending on position in freq domain
   float Phil = sqrt(PhillipsSpectrum(screenPos));
   float coeff = 1.0/sqrt(2.0);

   color = vec3(coeff *randomGuass.x * Phil,coeff * randomGuass.y * Phil,0.0);
}  

创建如下纹理: enter image description here

现在我完全迷失了如何: a)从初始纹理中导出三个方向的光谱

b)按照本文中提到的时间t(https://developer.nvidia.com/sites/default/files/akamai/gamedev/files/sdk/11/OceanCS_Slides.pdf)在幻灯片5上设置动画

我可能是完全愚蠢的,忽略了一些非常明显的东西 - 我看了很多论文,即使在熟悉了自己的意思之后也迷失了方程式。请帮忙。

0 个答案:

没有答案