void InitH0AndDispersionRelation(OceanParameter parameter, ref Vector2[] h0, ref float[] omega, ref Vector2[] phillip, ref Vector2[] Gauss_Data) { Vector2 windDir = parameter.wind_dir.normalized; Vector2 K = Vector2.zero; for (int i = 0; i < parameter.displaceMap_dimension; i++) { K.y = (-parameter.displaceMap_dimension / 2.0f + i) * (2 * Mathf.PI / parameter.patch_size); for (int j = 0; j < parameter.displaceMap_dimension; j++) { K.x = (-parameter.displaceMap_dimension / 2.0f + j) * (2 * Mathf.PI / parameter.patch_size); float phillips = (K.x == 0 && K.y == 0) ? 0 : Mathf.Sqrt(Phillips(K, windDir, parameter.wind_speed, parameter.wave_amplitude * 1e-7f, parameter.wind_dependency)); int index = i * parameter.displaceMap_dimension + j; float Gauss_x = Gauss(), Gauss_y = Gauss(); h0[index].x = phillips * Gauss_x * HALF_SQRT_2; h0[index].y = phillips * Gauss_y * HALF_SQRT_2; omega[index] = Mathf.Sqrt(GRAV_ACCEL * Mathf.Sqrt(K.x * K.x + K.y * K.y)); phillip[index].x = phillips; phillip[index].y = phillips; Gauss_Data[index].x = Gauss_x; Gauss_Data[index].y = Gauss_y; } } }
void UpdateDisplacementMap(float t, OceanParameter parameter) { if (h0Buffer == null || omegaBuffer == null || HKBuffer == null || DxBuffer == null || DyBuffer == null) { return; } // H(0) -> H(t), D(x,t), D(y,t) UpdateSpectrumShader.SetBuffer(0, "H0", h0Buffer); UpdateSpectrumShader.SetBuffer(0, "Omega", omegaBuffer); UpdateSpectrumShader.SetBuffer(0, "HK", HKBuffer); UpdateSpectrumShader.SetBuffer(0, "Dx", DxBuffer); UpdateSpectrumShader.SetBuffer(0, "Dy", DyBuffer); UpdateSpectrumShader.SetInt("Dimension", parameter.displaceMap_dimension); UpdateSpectrumShader.SetFloat("curTime", t); int GroupNum = parameter.displaceMap_dimension / OceanConst.THREAD_GROUP; UpdateSpectrumShader.Dispatch(0, GroupNum, GroupNum, 1); mFFT.EvaluteFFT(HKBuffer, ref HtBuffer); mFFT.EvaluteFFT(DxBuffer, ref DxtBuffer); mFFT.EvaluteFFT(DyBuffer, ref DytBuffer); }