我花了大约一个星期左右使用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);
}
创建如下纹理:
现在我完全迷失了如何: a)从初始纹理中导出三个方向的光谱
b)按照本文中提到的时间t(https://developer.nvidia.com/sites/default/files/akamai/gamedev/files/sdk/11/OceanCS_Slides.pdf)在幻灯片5上设置动画
我可能是完全愚蠢的,忽略了一些非常明显的东西 - 我看了很多论文,即使在熟悉了自己的意思之后也迷失了方程式。请帮忙。