From df35c11af249561d4f2e1609a14acf3c29fca5c1 Mon Sep 17 00:00:00 2001 From: Thorsten Renk Date: Mon, 15 Apr 2013 14:29:04 +0300 Subject: [PATCH] Packice overlay and water color variations for high quality water shader in Atmospheric Light Scattering --- Effects/water.eff | 38 +++++++++ Environment/environment.xml | 3 + Shaders/water_lightfield.frag | 110 ++++++++++++++++++++++++++- Shaders/water_lightfield.vert | 4 +- gui/dialogs/environment-settings.xml | 82 ++++++++++++++++---- 5 files changed, 218 insertions(+), 19 deletions(-) diff --git a/Effects/water.eff b/Effects/water.eff index 9629e9150..61f9bd7c0 100644 --- a/Effects/water.eff +++ b/Effects/water.eff @@ -45,6 +45,13 @@ repeat normalized + + Textures.high/Terrain/packice-overlay.png + linear-mipmap-linear + repeat + repeat + normalized + 0.0 /rendering/scene/saturation @@ -132,6 +139,9 @@ /sim/rendering/shaders/skydome + + /environment/sea/surface/ice-cover + /environment/sea/color_r @@ -312,6 +322,24 @@ texture[6]/internal-format + + 7 + + texture[10]/image + + + texture[10]/filter + + + texture[10]/wrap-s + + + texture[10]/wrap-t + + + texture[10]/internal-format + + Shaders/water_lightfield.vert @@ -342,6 +370,11 @@ sampler-2d 6 + + ice_texture + sampler-2d + 7 + normalmap_dds @@ -486,6 +519,11 @@ float cloud_self_shading + + ice_cover + float + ice_cover + sea_r diff --git a/Environment/environment.xml b/Environment/environment.xml index 43e8d8524..19290cfdd 100644 --- a/Environment/environment.xml +++ b/Environment/environment.xml @@ -404,6 +404,9 @@ 0.148 0.27 0.3 + + 0.0 + diff --git a/Shaders/water_lightfield.frag b/Shaders/water_lightfield.frag index 58a78e6af..ce729cc5d 100644 --- a/Shaders/water_lightfield.frag +++ b/Shaders/water_lightfield.frag @@ -12,6 +12,7 @@ uniform sampler2D water_normalmap; uniform sampler2D water_dudvmap; uniform sampler2D sea_foam; uniform sampler2D perlin_normalmap; +uniform sampler2D ice_texture; uniform sampler3D Noise; @@ -23,8 +24,8 @@ varying vec4 waterTex2; //moving texcoords varying vec4 waterTex4; //viewts varying vec3 viewerdir; varying vec3 lightdir; -//varying vec3 specular_light; varying vec3 relPos; +varying vec3 rawPos; varying float earthShade; varying float yprime_alt; @@ -49,6 +50,7 @@ uniform float scattering; uniform float ground_scattering; uniform float cloud_self_shading; uniform float eye_alt; +uniform float ice_cover; uniform float sea_r; uniform float sea_g; uniform float sea_b; @@ -68,6 +70,93 @@ vec3 fog_Func(vec3 color, int type); /////// functions ///////// +float rand2D(in vec2 co){ + return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453); +} + +float rand3D(in vec3 co){ + return fract(sin(dot(co.xyz ,vec3(12.9898,78.233,144.7272))) * 43758.5453); +} + +float cosine_interpolate(in float a, in float b, in float x) +{ + float ft = x * 3.1415927; + float f = (1.0 - cos(ft)) * .5; + + return a*(1.0-f) + b*f; +} + +float simple_interpolate(in float a, in float b, in float x) +{ +return a + smoothstep(0.0,1.0,x) * (b-a); +} + +float interpolatedNoise2D(in float x, in float y) +{ + float integer_x = x - fract(x); + float fractional_x = x - integer_x; + + float integer_y = y - fract(y); + float fractional_y = y - integer_y; + + float v1 = rand2D(vec2(integer_x, integer_y)); + float v2 = rand2D(vec2(integer_x+1.0, integer_y)); + float v3 = rand2D(vec2(integer_x, integer_y+1.0)); + float v4 = rand2D(vec2(integer_x+1.0, integer_y +1.0)); + + float i1 = simple_interpolate(v1 , v2 , fractional_x); + float i2 = simple_interpolate(v3 , v4 , fractional_x); + + return simple_interpolate(i1 , i2 , fractional_y); +} + +float interpolatedNoise3D(in float x, in float y, in float z) +{ + float integer_x = x - fract(x); + float fractional_x = x - integer_x; + + float integer_y = y - fract(y); + float fractional_y = y - integer_y; + + float integer_z = z - fract(z); + float fractional_z = z - integer_z; + + float v1 = rand3D(vec3(integer_x, integer_y, integer_z)); + float v2 = rand3D(vec3(integer_x+1.0, integer_y, integer_z)); + float v3 = rand3D(vec3(integer_x, integer_y+1.0, integer_z)); + float v4 = rand3D(vec3(integer_x+1.0, integer_y +1.0, integer_z)); + + float v5 = rand3D(vec3(integer_x, integer_y, integer_z+1.0)); + float v6 = rand3D(vec3(integer_x+1.0, integer_y, integer_z+1.0)); + float v7 = rand3D(vec3(integer_x, integer_y+1.0, integer_z+1.0)); + float v8 = rand3D(vec3(integer_x+1.0, integer_y +1.0, integer_z+1.0)); + + + float i1 = simple_interpolate(v1,v5, fractional_z); + float i2 = simple_interpolate(v2,v6, fractional_z); + float i3 = simple_interpolate(v3,v7, fractional_z); + float i4 = simple_interpolate(v4,v8, fractional_z); + + float ii1 = simple_interpolate(i1,i2,fractional_x); + float ii2 = simple_interpolate(i3,i4,fractional_x); + + + return simple_interpolate(ii1 , ii2 , fractional_y); +} + +float Noise2D(in vec2 coord, in float wavelength) +{ +return interpolatedNoise2D(coord.x/wavelength, coord.y/wavelength); + +} + +float Noise3D(in vec3 coord, in float wavelength) +{ +return interpolatedNoise3D(coord.x/wavelength, coord.y/wavelength, coord.z/wavelength); +} + + + void rotationmatrix(in float angle, out mat4 rotmat) { rotmat = mat4( cos( angle ), -sin( angle ), 0.0, 0.0, @@ -199,6 +288,12 @@ void main(void) const vec4 sca2 = vec4(0.02, 0.02, 0.02, 0.02); const vec4 tscale = vec4(0.25, 0.25, 0.25, 0.25); + float noise_50m = Noise3D(rawPos.xyz, 50.0); + float noise_250m = Noise3D(rawPos.xyz,250.0); + float noise_1500m = Noise3D(rawPos.xyz,1500.0); + float noise_2000m = Noise3D(rawPos.xyz,2000.0); + float noise_2500m = Noise3D(rawPos.xyz, 2500.0); + mat4 RotationMatrix; // compute direction to viewer @@ -332,6 +427,7 @@ void main(void) if (normalmap_dds > 0) {vNorm = -vNorm;} //dds fix + vNorm = vNorm * (0.5 + 0.5 * noise_250m); //load reflection @@ -342,6 +438,7 @@ void main(void) refl.b = sea_b; refl.a = 1.0; + refl.g = refl.g * (0.9 + 0.2* noise_2500m); float intensity; // de-saturate for reduced light @@ -435,7 +532,16 @@ void main(void) - finalColor *= ambient_light; + // add ice + vec4 ice_texel = texture2D(ice_texture, vec2(waterTex2) * 0.2 ); + + float nSum = 0.5 * (noise_250m + noise_50m); + float mix_factor = smoothstep(1.0 - ice_cover, 1.04-ice_cover, nSum); + finalColor = mix(finalColor, ice_texel, mix_factor * ice_texel.a); + finalColor.a = 1.0; + + + finalColor *= ambient_light; diff --git a/Shaders/water_lightfield.vert b/Shaders/water_lightfield.vert index c6803a1dc..f3657a22b 100644 --- a/Shaders/water_lightfield.vert +++ b/Shaders/water_lightfield.vert @@ -11,7 +11,7 @@ varying vec4 waterTex1; varying vec4 waterTex2; varying vec4 waterTex4; varying vec3 relPos; - +varying vec3 rawPos; varying vec3 viewerdir; varying vec3 lightdir; @@ -31,6 +31,7 @@ uniform float visibility; uniform float overcast; uniform float ground_scattering; +uniform mat4 osg_ViewMatrixInverse; vec3 specular_light; @@ -72,6 +73,7 @@ void main(void) vec3 shadedFogColor = vec3(0.65, 0.67, 0.78); + rawPos = (osg_ViewMatrixInverse *gl_ModelViewMatrix * gl_Vertex).xyz; vec4 ecPosition = gl_ModelViewMatrix * gl_Vertex; diff --git a/gui/dialogs/environment-settings.xml b/gui/dialogs/environment-settings.xml index e0c797315..a0481db81 100644 --- a/gui/dialogs/environment-settings.xml +++ b/gui/dialogs/environment-settings.xml @@ -194,13 +194,63 @@ 3 + + + + /sim/rendering/shaders/skydome + + + left + 4 + 0 + + + + + /sim/rendering/shaders/skydome + + + right + 4 + 1 + + + + + /sim/rendering/shaders/skydome + + ice-cover + 4 + 2 + 0.0 + 1.0 + true + /environment/sea/surface/ice-cover + + dialog-apply + ice-cover + + + + + + /sim/rendering/shaders/skydome + + + left + 4 + 3 + + + + /sim/rendering/shaders/skydome left - 4 + 5 0 @@ -210,7 +260,7 @@ right - 4 + 5 1 @@ -219,7 +269,7 @@ /sim/rendering/shaders/skydome dust-level - 4 + 5 2 0.0 0.7 @@ -237,7 +287,7 @@ left - 4 + 5 3 @@ -247,7 +297,7 @@ left - 5 + 6 0 @@ -257,7 +307,7 @@ right - 5 + 6 1 @@ -266,7 +316,7 @@ /sim/rendering/shaders/skydome wetness - 5 + 6 2 0.0 0.7 @@ -284,7 +334,7 @@ left - 5 + 6 3 @@ -295,7 +345,7 @@ left - 6 + 7 0 @@ -305,7 +355,7 @@ right - 6 + 7 1 @@ -314,7 +364,7 @@ /sim/rendering/shaders/skydome lichen-level - 6 + 7 2 0.0 0.7 @@ -332,7 +382,7 @@ left - 6 + 7 3 @@ -343,7 +393,7 @@ left - 7 + 8 0 @@ -353,7 +403,7 @@ right - 7 + 8 1 @@ -362,7 +412,7 @@ /sim/rendering/shaders/skydome season - 7 + 8 2 0.0 2.0 @@ -380,7 +430,7 @@ left - 7 + 8 3