From bf42b2bab88ee47de762ce67f4cdfc23b17dc962 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C3=ABl=20Lemaire?= Date: Tue, 12 Jan 2016 19:36:25 +0100 Subject: [PATCH] Smoothed water LOD in OpenGL --- src/basics/NoiseFunctionSimplex.cpp | 8 ++++---- src/render/opengl/shaders/noise.frag | 8 +++++++- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/basics/NoiseFunctionSimplex.cpp b/src/basics/NoiseFunctionSimplex.cpp index fc8b4dc..4f42cae 100644 --- a/src/basics/NoiseFunctionSimplex.cpp +++ b/src/basics/NoiseFunctionSimplex.cpp @@ -517,14 +517,14 @@ const Texture2D *NoiseFunctionSimplex::getNormalTexture() { // TODO Make texture tileable double dx = to_double(x) / to_double(width); double dz = to_double(z) / to_double(height); - double vcenter = noiseSimplexGet2DValue(scale * dx, scale * dz) - 0.5; - double vsouth = noiseSimplexGet2DValue(scale * dx, scale * dz + offset) - 0.5; - double veast = noiseSimplexGet2DValue(scale * dx + offset, scale * dz) - 0.5; + double vcenter = noiseSimplexGet2DValue(scale * dx, scale * dz); + double vsouth = noiseSimplexGet2DValue(scale * dx, scale * dz + offset); + double veast = noiseSimplexGet2DValue(scale * dx + offset, scale * dz); Vector3 normal = Geometry::getNormalFromTriangle( Vector3(0.0, vcenter, 0.0), Vector3(0.0, vsouth, offset), Vector3(offset, veast, 0.0)); - _normalTexture->setPixel(x, z, Color(normal.x + 0.5, normal.y + 0.5, normal.z + 0.5)); + _normalTexture->setPixel(x, z, Color(normal.x * 0.5 + 0.5, normal.y * 0.5 + 0.5, normal.z * 0.5 + 0.5)); } } } diff --git a/src/render/opengl/shaders/noise.frag b/src/render/opengl/shaders/noise.frag index d466fc6..61be54f 100644 --- a/src/render/opengl/shaders/noise.frag +++ b/src/render/opengl/shaders/noise.frag @@ -11,7 +11,13 @@ vec3 noiseNormal2d(float[4] data, vec2 location, float detail) { // TODO offsets // TODO parametrized texture scaling - normal += texture(simplexSampler, location * scaling / 15.0).xyz - vec3(0.5); + float factor; + if (height * step_height <= detail) { + factor = (height - detail) / (height - height * step_height); + } else { + factor = 1.0; + } + normal += (texture(simplexSampler, location * scaling / 15.0).xyz * 2.0 - 1.0) * factor; scaling *= step_scaling; height *= step_height; }