35static float alpha_beta_spectrum(
const float alpha,
39 const float peakomega)
41 return (alpha *
sqrt(gamma) /
pow(omega, 5.0)) *
exp(-
beta *
pow(peakomega / omega, 4.0));
44static float peak_sharpen(
const float omega,
const float m_peakomega,
const float m_gamma)
46 const float peak_sharpening_sigma = (omega < m_peakomega) ? 0.07 : 0.09;
47 const float peak_sharpening =
pow(
48 m_gamma,
exp(-
sqrt((omega - m_peakomega) / (peak_sharpening_sigma * m_peakomega)) / 2.0));
50 return peak_sharpening;
56static float ocean_spectrum_wind_and_damp(
const Ocean *oc,
61 const float k2 = kx * kx + kz * kz;
62 const float k_mag_inv = 1.0f / k2;
63 const float k_dot_w = (kx * k_mag_inv * oc->_wx) + (kz * k_mag_inv * oc->_wz);
66 float newval = val *
pow(
fabs(k_dot_w), oc->_wind_alignment);
73 if (oc->_wind_alignment > 0.0) {
74 newval *= oc->_damp_reflections;
81static float jonswap(
const Ocean *oc,
const float k2)
84 const float k_mag =
sqrt(k2);
86 const float m_omega = GRAVITY * k_mag *
tanh(k_mag * oc->_depth);
87 const float omega =
sqrt(m_omega);
89 const float m_fetch = oc->_fetch_jonswap;
93 float m_gamma = oc->_sharpen_peak_jonswap;
101 const float m_windspeed = oc->_V;
103 const float m_dimensionlessFetch =
fabs(GRAVITY * m_fetch /
sqrt(m_windspeed));
104 const float m_alpha = 0.076 *
pow(m_dimensionlessFetch, -0.22);
106 const float m_tau =
M_PI * 2;
107 const float m_peakomega = m_tau * 3.5 *
fabs(GRAVITY / oc->_V) *
108 pow(m_dimensionlessFetch, -0.33);
110 const float beta = 1.25f;
112 float val = alpha_beta_spectrum(m_alpha,
beta, GRAVITY, omega, m_peakomega);
115 val *= peak_sharpen(m_omega, m_peakomega, m_gamma);
122 const float k2 = kx * kx + kz * kz;
130 const float peak_omega_PM = 0.87f * GRAVITY / oc->_V;
132 const float k_mag =
sqrt(k2);
133 const float m_omega = GRAVITY * k_mag *
tanh(k_mag * oc->_depth);
135 const float omega =
sqrt(m_omega);
136 const float alpha = 0.0081f;
137 const float beta = 1.291f;
139 float val = alpha_beta_spectrum(alpha,
beta, GRAVITY, omega, peak_omega_PM);
141 val = ocean_spectrum_wind_and_damp(oc, kx, kz, val);
148 const float k2 = kx * kx + kz * kz;
155 float val = jonswap(oc, k2);
157 val = ocean_spectrum_wind_and_damp(oc, kx, kz, val);
160 const float m_depth = oc->_depth;
163 const float k_mag =
sqrt(k2);
165 const float m_omega = GRAVITY * k_mag *
tanh(k_mag * oc->_depth);
166 const float omega =
sqrt(m_omega);
168 const float kitaigorodskiiDepth_wh = omega * gain;
169 const float kitaigorodskiiDepth = 0.5 + (0.5 *
tanh(1.8 * (kitaigorodskiiDepth_wh - 1.125)));
171 val *= kitaigorodskiiDepth;
173 val = ocean_spectrum_wind_and_damp(oc, kx, kz, val);
180 const float k2 = kx * kx + kz * kz;
187 float val = jonswap(oc, k2);
189 val = ocean_spectrum_wind_and_damp(oc, kx, kz, val);
float BLI_ocean_spectrum_piersonmoskowitz(const struct Ocean *oc, float kx, float kz)
float BLI_ocean_spectrum_jonswap(const struct Ocean *oc, float kx, float kz)
float BLI_ocean_spectrum_texelmarsenarsloe(const struct Ocean *oc, float kx, float kz)
pow(value.r - subtrahend, 2.0)") .do_static_compilation(true)
ccl_device_inline float2 fabs(const float2 a)
ccl_device_inline float3 exp(float3 v)
INLINE Rall1d< T, V, S > tanh(const Rall1d< T, V, S > &arg)
ccl_device_inline float beta(float x, float y)