Fix turbulence module in GPU particles far away from world origin

#1944
This commit is contained in:
Wojtek Figat
2024-08-27 15:12:58 +02:00
parent e5f0e05d43
commit 0b3835f593
2 changed files with 13 additions and 9 deletions

View File

@@ -66,12 +66,14 @@ bool GPUParticles::Init(ParticleEmitter* owner, MemoryReadStream& shaderCacheStr
LOG(Warning, "Missing valid GPU particles constant buffer."); LOG(Warning, "Missing valid GPU particles constant buffer.");
return true; return true;
} }
if (cb0->GetSize() < sizeof(GPUParticlesData)) const int32 cbSize = cb0->GetSize();
if (cbSize < sizeof(GPUParticlesData))
{ {
LOG(Warning, "Invalid size GPU particles constant buffer. required {0} bytes but got {1}", sizeof(GPUParticlesData), cb0->GetSize()); LOG(Warning, "Invalid size GPU particles constant buffer. required {0} bytes but got {1}", sizeof(GPUParticlesData), cbSize);
return true; return true;
} }
_cbData.Resize(cb0->GetSize()); _cbData.Resize(cbSize);
Platform::MemoryClear(_cbData.Get(), cbSize);
// Load material parameters // Load material parameters
if (_params.Load(materialParamsStream)) if (_params.Load(materialParamsStream))

View File

@@ -321,23 +321,25 @@ float3 CustomNoise3D(float3 p)
float c = CustomNoise(p + float3(0.0f, 0.0f, 0.0001f)); float c = CustomNoise(p + float3(0.0f, 0.0f, 0.0001f));
float3 grad = float3(o - a, o - b, o - c); float3 grad = float3(o - a, o - b, o - c);
float3 other = abs(grad.zxy); float3 ret = cross(grad, abs(grad.zxy));
return normalize(cross(grad,other)); if (length(ret) <= 0.0001f) return float3(0.0f, 0.0f, 0.0f);
return normalize(ret);
} }
float3 CustomNoise3D(float3 position, int octaves, float roughness) float3 CustomNoise3D(float3 position, int octaves, float roughness)
{ {
float weight = 0.0f; float weight = 0.0f;
float3 noise = float3(0.0, 0.0, 0.0); float3 noise = float3(0.0f, 0.0f, 0.0f);
float scale = 1.0f; float scale = 1.0f;
roughness = lerp(2.0f, 0.2f, roughness);
for (int i = 0; i < octaves; i++) for (int i = 0; i < octaves; i++)
{ {
float curWeight = pow((1.0 - ((float)i / octaves)), lerp(2.0, 0.2, roughness)); float curWeight = pow((1.0f - ((float)i / (float)octaves)), roughness);
noise += CustomNoise3D(position * scale) * curWeight; noise += CustomNoise3D(position * scale) * curWeight;
weight += curWeight; weight += curWeight;
scale *= 1.72531; scale *= 1.72531f;
} }
return noise / weight; return noise / max(weight, 0.0001f);
} }
#endif #endif