diff --git a/Effects/water.eff b/Effects/water.eff index 61f9bd7c0..bf201aa17 100644 --- a/Effects/water.eff +++ b/Effects/water.eff @@ -139,9 +139,15 @@ /sim/rendering/shaders/skydome + + /environment/fog-structure + /environment/sea/surface/ice-cover + + /sim/rendering/shaders/landmass + /environment/sea/color_r @@ -519,6 +525,11 @@ float cloud_self_shading + + fogstructure + float + fogstructure + ice_cover float @@ -546,6 +557,11 @@ sea_b + + quality_level + int + quality_level + diff --git a/Shaders/terrain-haze-detailed.frag b/Shaders/terrain-haze-detailed.frag index 427420fb5..b8bd4d8d7 100644 --- a/Shaders/terrain-haze-detailed.frag +++ b/Shaders/terrain-haze-detailed.frag @@ -4,10 +4,10 @@ // Ambient term comes in gl_Color.rgb. varying vec4 diffuse_term; varying vec3 normal; -//varying vec2 nvec; varying vec3 relPos; varying vec2 rawPos; -//varying vec3 ecViewdir; +varying vec3 worldPos; + uniform sampler2D texture; @@ -56,6 +56,10 @@ 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; @@ -90,12 +94,52 @@ float interpolatedNoise2D(in float x, in float 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); +} + float light_func (in float x, in float a, in float b, in float c, in float d, in float e) @@ -190,12 +234,12 @@ float noisegrad_10m; float noisegrad_5m; float noise_50m = Noise2D(rawPos.xy, 50.0);; -float noise_250m; -float noise_500m = Noise2D(rawPos.xy, 500.0); -float noise_1500m = Noise2D(rawPos.xy, 1500.0); -float noise_2000m = Noise2D(rawPos.xy, 2000.0); +float noise_250m = Noise3D(worldPos.xyz,250.0); +float noise_500m = Noise3D(worldPos.xyz, 500.0); +float noise_1500m = Noise3D(worldPos.xyz, 1500.0); +float noise_2000m = Noise3D(worldPos.xyz, 2000.0); @@ -293,7 +337,7 @@ if (tquality_level > 3) if (flag == 1) { //noise_50m = Noise2D(rawPos.xy, 50.0); - noise_250m = Noise2D(rawPos.xy, 250.0); + //noise_250m = Noise2D(rawPos.xy, 250.0); dist_fact = 0.1 * smoothstep(15000.0,40000.0, dist) - 0.03 * (1.0 - smoothstep(500.0,5000.0, dist)); nSum = ((1.0 -noise_2000m) + noise_1500m + 2.0 * noise_250m +noise_50m)/5.0; nSum = nSum - 0.08 * (1.0 -smoothstep(0.9,0.95, abs(steepness))); @@ -389,7 +433,7 @@ if ((dist < 5000.0)&& (quality_level > 3) && (wetness>0.0)) color += diffuse_term * NdotL; NdotHV = max(dot(n, halfVector), 0.0); if (gl_FrontMaterial.shininess > 0.0) - specular.rgb = ((gl_FrontMaterial.specular.rgb + (water_factor * vec3 (1.0, 1.0, 1.0))) + specular.rgb = ((gl_FrontMaterial.specular.rgb * 0.1 + (water_factor * vec3 (1.0, 1.0, 1.0))) * light_specular.rgb * pow(NdotHV, gl_FrontMaterial.shininess + (20.0 * water_factor))); } diff --git a/Shaders/terrain-haze-detailed.vert b/Shaders/terrain-haze-detailed.vert index 511532937..f7aecf4db 100644 --- a/Shaders/terrain-haze-detailed.vert +++ b/Shaders/terrain-haze-detailed.vert @@ -20,13 +20,11 @@ // bugs with gl_FrontFacing in the fragment shader. varying vec4 diffuse_term; varying vec3 normal; -//varying vec2 nvec; varying vec3 relPos; varying vec2 rawPos; -//varying vec3 ecViewdir; +varying vec3 worldPos; + -//varying float earthShade; -//varying float yprime_alt; varying float mie_angle; varying float steepness; @@ -42,6 +40,8 @@ uniform float ground_scattering; uniform float eye_alt; uniform float moonlight; +uniform mat4 osg_ViewMatrixInverse; + float earthShade; float yprime_alt; //float mie_angle; @@ -78,6 +78,7 @@ void main() float scattering; rawPos = gl_Vertex.xy; + worldPos = (osg_ViewMatrixInverse *gl_ModelViewMatrix * gl_Vertex).xyz; steepness = dot(normalize(gl_Normal), vec3 (0.0, 0.0, 1.0)); @@ -260,6 +261,13 @@ else // the faster, full-day version without lightfields light_ambient = light_ambient * ((1.0+steepness)/2.0 * 1.2 + (1.0-steepness)/2.0 * 0.2); +// deeper shadows when there is lots of direct light + +float shade_depth = 1.0 * smoothstep (0.6,0.95,ground_scattering) * (1.0-smoothstep(0.1,0.5,overcast)) * smoothstep(0.4,1.5,earthShade); + + light_ambient.rgb = light_ambient.rgb * (1.0 - shade_depth); + light_diffuse.rgb = light_diffuse.rgb * (1.0 + 1.2 * shade_depth); + // default lighting based on texture and material using the light we have just computed diffuse_term = diffuse_color* light_diffuse; diff --git a/Shaders/terrain-haze-ultra.frag b/Shaders/terrain-haze-ultra.frag index 7fde2d61d..51984fac4 100644 --- a/Shaders/terrain-haze-ultra.frag +++ b/Shaders/terrain-haze-ultra.frag @@ -529,7 +529,7 @@ if ((dist < 5000.0)&& (quality_level > 3) && (combined_wetness>0.0)) color += diffuse_term * NdotL; NdotHV = max(dot(n, halfVector), 0.0); if (gl_FrontMaterial.shininess > 0.0) - specular.rgb = ((gl_FrontMaterial.specular.rgb + (water_factor * vec3 (1.0, 1.0, 1.0))) + specular.rgb = ((gl_FrontMaterial.specular.rgb * 0.1 + (water_factor * vec3 (1.0, 1.0, 1.0))) * light_specular.rgb * pow(NdotHV, gl_FrontMaterial.shininess + (20.0 * water_factor))); } diff --git a/Shaders/urban-lightfield.frag b/Shaders/urban-lightfield.frag index 3bb783173..be7945d43 100644 --- a/Shaders/urban-lightfield.frag +++ b/Shaders/urban-lightfield.frag @@ -14,7 +14,7 @@ #define BINARY_SEARCH_COUNT 10 #define BILINEAR_SMOOTH_FACTOR 2.0 -varying vec2 rawpos; +varying vec3 worldPos; varying vec4 ecPosition; varying vec3 VNormal; varying vec3 VTangent; @@ -28,7 +28,7 @@ varying float yprime_alt; varying float mie_angle; //varying float steepness; -uniform sampler3D NoiseTex; +//uniform sampler3D NoiseTex; uniform sampler2D BaseTex; uniform sampler2D NormalTex; uniform sampler2D QDMTex; @@ -66,6 +66,10 @@ 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 simple_interpolate(in float a, in float b, in float x) { @@ -92,12 +96,50 @@ float interpolatedNoise2D(in float x, in float 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); +} float light_func (in float x, in float a, in float b, in float c, in float d, in float e) @@ -336,9 +378,8 @@ void main (void) vec4 dust_color; -float noise_1500m = Noise2D(rawpos.xy, 1500.0); -float noise_2000m = Noise2D(rawpos.xy, 2000.0); - +float noise_1500m = Noise3D(worldPos.xyz,1500.0); +float noise_2000m = Noise3D(worldPos.xyz,2000.0); if (quality_level > 2) { diff --git a/Shaders/urban-lightfield.vert b/Shaders/urban-lightfield.vert index 42ad2d29f..0f2a33a9d 100644 --- a/Shaders/urban-lightfield.vert +++ b/Shaders/urban-lightfield.vert @@ -21,7 +21,7 @@ varying vec3 relPos; -varying vec2 rawPos; +varying vec3 worldPos; varying vec3 VNormal; varying vec3 VTangent; varying vec4 ecPosition; @@ -44,6 +44,7 @@ uniform float ground_scattering; uniform float eye_alt; uniform float moonlight; +uniform mat4 osg_ViewMatrixInverse; attribute vec3 tangent;//, binormal; @@ -80,7 +81,8 @@ void main() float vertex_alt; float scattering; - rawPos = gl_Vertex.xy; + //rawPos = gl_Vertex.xy; + worldPos = (osg_ViewMatrixInverse *gl_ModelViewMatrix * gl_Vertex).xyz; steepness = dot(normalize(gl_Normal), vec3 (0.0, 0.0, 1.0)); VNormal = normalize(gl_NormalMatrix * gl_Normal); ecPosition = gl_ModelViewMatrix * gl_Vertex; diff --git a/Shaders/water_lightfield.frag b/Shaders/water_lightfield.frag index ce729cc5d..716169be6 100644 --- a/Shaders/water_lightfield.frag +++ b/Shaders/water_lightfield.frag @@ -50,11 +50,13 @@ uniform float scattering; uniform float ground_scattering; uniform float cloud_self_shading; uniform float eye_alt; +uniform float fogstructure; uniform float ice_cover; uniform float sea_r; uniform float sea_g; uniform float sea_b; +uniform int quality_level; vec3 specular_light; @@ -614,7 +616,7 @@ transmission_arg = (dist-distance_in_layer)/avisibility; float eqColorFactor; - +/* if (visibility < avisibility) { transmission_arg = transmission_arg + (distance_in_layer/visibility); @@ -628,6 +630,33 @@ else // this combines the Weber-Fechner intensity eqColorFactor = 1.0 - 0.1 * delta_zv/avisibility - (1.0 -effective_scattering); } +*/ +if (visibility < avisibility) + { + if (quality_level > 3) + { + transmission_arg = transmission_arg + (distance_in_layer/(1.0 * visibility + 1.0 * visibility * fogstructure * 0.06 * (noise_1500m + noise_2000m -1.0) )); + } + else + { + transmission_arg = transmission_arg + (distance_in_layer/visibility); + } + // this combines the Weber-Fechner intensity + eqColorFactor = 1.0 - 0.1 * delta_zv/visibility - (1.0 -effective_scattering); + } +else + { + if (quality_level > 3) + { + transmission_arg = transmission_arg + (distance_in_layer/(1.0 * avisibility + 1.0 * avisibility * fogstructure * 0.06 * (noise_1500m + noise_2000m - 1.0) )); + } + else + { + transmission_arg = transmission_arg + (distance_in_layer/avisibility); + } + // this combines the Weber-Fechner intensity + eqColorFactor = 1.0 - 0.1 * delta_zv/avisibility - (1.0 -effective_scattering); + } transmission = fog_func(transmission_arg);