From 9be134b34d434476be6ab5545edb2beb9708fbfb Mon Sep 17 00:00:00 2001 From: Thorsten Renk Date: Mon, 6 Aug 2012 14:15:43 +0300 Subject: [PATCH] Procedural Texturing --- Effects/terrain-default.eff | 91 +++- Effects/tree.eff | 51 +- Effects/urban.eff | 542 +++++++++++++++++++++- Environment/environment.xml | 9 +- Materials/regions/materials.xml | 55 ++- Shaders/terrain-haze-detailed.frag | 323 +++++++++---- Shaders/terrain-haze-detailed.vert | 54 ++- Shaders/terrain-haze.frag | 16 +- Shaders/terrain-haze.vert | 11 +- Shaders/tree-haze.frag | 70 +-- Shaders/tree-haze.vert | 31 +- Shaders/trivial.frag | 12 + Shaders/trivial.vert | 18 + Shaders/urban-lightfield.frag | 537 +++++++++++++++++++++ Shaders/urban-lightfield.vert | 279 +++++++++++ Shaders/urban.frag | 5 +- Shaders/urban.vert | 4 +- Textures/Terrain/dirtrock.png | Bin 0 -> 118638 bytes Textures/Terrain/void.png | Bin 0 -> 251 bytes gui/dialogs/local_weather_environment.xml | 32 ++ gui/dialogs/shaders-lightfield.xml | 54 +++ 21 files changed, 1942 insertions(+), 252 deletions(-) create mode 100644 Shaders/trivial.frag create mode 100644 Shaders/trivial.vert create mode 100644 Shaders/urban-lightfield.frag create mode 100644 Shaders/urban-lightfield.vert create mode 100644 Textures/Terrain/dirtrock.png create mode 100644 Textures/Terrain/void.png diff --git a/Effects/terrain-default.eff b/Effects/terrain-default.eff index e63d81506..d470b92e4 100644 --- a/Effects/terrain-default.eff +++ b/Effects/terrain-default.eff @@ -37,6 +37,20 @@ repeat normalized + + Textures/Terrain/void.png + linear-mipmap-linear + repeat + repeat + normalized + + + Textures/Terrain/void.png + linear-mipmap-linear + repeat + repeat + normalized + false 0 @@ -54,8 +68,11 @@ /sim/rendering/eye-altitude-m /environment/mysnow-level-m /environment/surface/dust-cover-factor + /environment/surface/wetness /sim/rendering/shaders/skydome /environment/fog-structure + /sim/rendering/shaders/landmass + /sim/rendering/shaders/transition @@ -64,10 +81,16 @@ /sim/rendering/shaders/skydome + 4.0 /sim/rendering/shaders/landmass + + 3.0 + /sim/rendering/shaders/transition + + 2.0 @@ -99,7 +122,7 @@ -1 RenderBin - + - Shaders/include_fog.vert + + Shaders/trivial.vert + Shaders/trivial.frag - + + 0 0 0 0 @@ -144,6 +166,10 @@ render-bin/bin-number render-bin/bin-name + 0 texture[0]/image @@ -158,7 +184,17 @@ 1 noise - + + 5 + texture[12]/image + texture[12]/filter + texture[12]/wrap-s + texture[12]/wrap-t + + texture[12]/internal-format + + + 6 texture[10]/image texture[10]/filter @@ -168,6 +204,16 @@ texture[10]/internal-format + + 7 + texture[11]/image + texture[11]/filter + texture[11]/wrap-s + texture[11]/wrap-t + + texture[11]/internal-format + + Shaders/terrain-haze-detailed.vert Shaders/terrain-haze-detailed.frag @@ -226,12 +272,27 @@ dust_cover_factor float dust_cover_factor + + + wetness + float + wetness fogstructure float fogstructure + + quality_level + int + quality_level + + + tquality_level + int + tquality_level + texture sampler-2d @@ -242,11 +303,21 @@ sampler-3d 1 + + mix_texture + sampler-2d + 5 + snow_texture sampler-2d 6 + + detail_texture + sampler-2d + 7 + colorMode int diff --git a/Effects/tree.eff b/Effects/tree.eff index ae2d4864b..a7c207983 100644 --- a/Effects/tree.eff +++ b/Effects/tree.eff @@ -38,7 +38,7 @@ /sim/rendering/shaders/skydome - /sim/rendering/random-vegetation + /sim/rendering/random-vegetation 2.0 @@ -53,48 +53,7 @@ - - true - - 1.0 1.0 1.0 1.0 - 1.0 1.0 1.0 1.0 - off - - - -1 - RenderBin - - - src-alpha - one-minus-src-alpha - - - gequal - 0.1 - - - 0 - 2d - - texture[0]/image - - clamp - clamp - - - - - Shaders/tree.vert - Shaders/include_fog.frag - Shaders/tree.frag - - - texture - sampler-2d - 0 - - 0 0 0 0 - + true @@ -174,11 +133,13 @@ int 2 - + + + diff --git a/Effects/urban.eff b/Effects/urban.eff index df4ac6a44..f6a3130dd 100644 --- a/Effects/urban.eff +++ b/Effects/urban.eff @@ -37,8 +37,548 @@ 15 6 - 7 + + + + + + + + + /sim/rendering/shaders/skydome + /sim/rendering/shaders/urban + + 4.0 + /sim/rendering/shaders/urban + + + /sim/rendering/random-buildings + false + + + + 2.0 + + + + GL_ARB_shader_objects + GL_ARB_shading_language_100 + GL_ARB_vertex_shader + GL_ARB_fragment_shader + + + + GL_ATI_shader_texture_lod + GL_ARB_shader_texture_lod + GL_EXT_gpu_shader4 + + + + + true + + + material/ambient + + + material/diffuse + + + material/specular + + ambient-and-diffuse + + + transparent + + + transparent + + smooth + back + + + render-bin/bin-number + + + render-bin/bin-name + + + + 0 + + texture[0]/image + + + texture[0]/filter + + + texture[0]/wrap-s + + + texture[0]/wrap-t + + + texture[0]/internal-format + + + + 1 + + texture[2]/image + + + texture[2]/filter + + + texture[2]/wrap-s + + + texture[2]/wrap-t + + + texture[2]/internal-format + + + + 2 + + texture[2]/image + + nearest-mipmap-nearest + + texture[2]/wrap-s + + + texture[2]/wrap-t + + + texture[2]/internal-format + + + average + average + average + min + + + + 3 + noise + + + Shaders/urban-lightfield.vert + + Shaders/urban-lightfield.frag + + tangent + 6 + + + + normal + 15 + + + + BaseTex + sampler-2d + 0 + + + NormalTex + sampler-2d + 1 + + + QDMTex + sampler-2d + 2 + + + NoiseTex + sampler-3d + 3 + + + depth_factor + float + + depth-factor + + + + tile_size + float + + xsize + + + + night_color + float-vec3 + + night-color + + + + quality_level + float + + quality-level + + + + snowlevel + float + + snow-level + + + + max_lod_level + float + + max-lod-level + + + + + visibility + float + + visibility + + + + avisibility + float + + avisibility + + + + hazeLayerAltitude + float + + lthickness + + + + scattering + float + + scattering + + + + ground_scattering + float + ground_scattering + + + terminator + float + + terminator + + + + terrain_alt + float + terrain_alt + + + overcast + float + overcast + + + eye_alt + float + eye_alt + + + mysnowlevel + float + mysnow_level + + + dust_cover_factor + float + dust_cover_factor + + + wetness + float + wetness + + + fogstructure + float + fogstructure + + + + + + + + + + + /sim/rendering/shaders/urban + + 1.0 + /sim/rendering/shaders/urban + + + /sim/rendering/random-buildings + false + + + + 2.0 + + + + GL_ARB_shader_objects + GL_ARB_shading_language_100 + GL_ARB_vertex_shader + GL_ARB_fragment_shader + + + + + + + true + + + material/ambient + + + material/diffuse + + + material/specular + + ambient-and-diffuse + + + transparent + + + transparent + + smooth + back + + + render-bin/bin-number + + + render-bin/bin-name + + + + 0 + + texture[0]/image + + + texture[0]/filter + + + texture[0]/wrap-s + + + texture[0]/wrap-t + + + texture[0]/internal-format + + + + 1 + + texture[2]/image + + + texture[2]/filter + + + texture[2]/wrap-s + + + texture[2]/wrap-t + + + texture[2]/internal-format + + + + 2 + noise + + + Shaders/urban-lightfield.vert + Shaders/urban-lightfield.frag + + + tangent + 6 + + + + normal + 15 + + + + + visibility + float + + visibility + + + + avisibility + float + + avisibility + + + + hazeLayerAltitude + float + + lthickness + + + + scattering + float + + scattering + + + + ground_scattering + float + ground_scattering + + + terminator + float + + terminator + + + + + terrain_alt + float + terrain_alt + + + overcast + float + overcast + + + eye_alt + float + eye_alt + + + mysnowlevel + float + mysnow_level + + + dust_cover_factor + float + dust_cover_factor + + + wetness + float + wetness + + + fogstructure + float + fogstructure + + + + + + BaseTex + sampler-2d + 0 + + + NormalTex + sampler-2d + 1 + + + NoiseTex + sampler-3d + 2 + + + depth_factor + float + + depth-factor + + + + tile_size + float + + xsize + + + + night_color + float-vec3 + + night-color + + + + quality_level + float + + quality-level + + + + snowlevel + float + + snow-level + + + + + + + + + diff --git a/Environment/environment.xml b/Environment/environment.xml index b2b65d2bb..dd6a4a33d 100644 --- a/Environment/environment.xml +++ b/Environment/environment.xml @@ -340,15 +340,16 @@ 16000.0 - 0.0 + 0.0 2000.0 1000000.0 0.0 - 3200.0 - 0.0 + 3200.0 + 0.0 0.7 - 0.0 + 0.0 + 0.0 diff --git a/Materials/regions/materials.xml b/Materials/regions/materials.xml index 14fdf8953..31c12bc2a 100644 --- a/Materials/regions/materials.xml +++ b/Materials/regions/materials.xml @@ -1435,9 +1435,21 @@ Sand - Terrain/sand4.png + + Terrain/sand4.png + Terrain/sand_hires.png + + + Terrain/sand5.png + Terrain/sand_hires.png + + + Terrain/sand6.png + Terrain/sand_hires.png + + 2000 2000 10000000.0 @@ -1463,8 +1475,12 @@ ScrubCover Scrub Sclerophyllous - Terrain/shrub1.png - 2000 2000 1 @@ -1766,9 +1794,24 @@ HerbTundraCover HerbTundra Effects/herbtundra + Terrain/herbtundra.png + Terrain/grass_hires.png + Terrain/rock.png + + Terrain/herbtundra2.png + Terrain/grass_hires.png + Terrain/rock.png + + Terrain/herbtundra3.png + Terrain/grass_hires.png + Terrain/rock.png + + 2000 2000 4000000.0 diff --git a/Shaders/terrain-haze-detailed.frag b/Shaders/terrain-haze-detailed.frag index 8764e1956..db08d43f8 100644 --- a/Shaders/terrain-haze-detailed.frag +++ b/Shaders/terrain-haze-detailed.frag @@ -5,23 +5,16 @@ varying vec4 diffuse_term; varying vec3 normal; varying vec3 relPos; -varying vec4 rawPos; +varying vec3 rawPos; +//varying vec3 ecViewdir; -//varying vec3 hazeColor; -//varying float fogCoord; - uniform sampler2D texture; uniform sampler3D NoiseTex; uniform sampler2D snow_texture; +uniform sampler2D detail_texture; +uniform sampler2D mix_texture; -//varying float ct; -//varying float delta_z; -//varying float alt; - -varying float earthShade; -//varying float yprime; -//varying float vertex_alt; varying float yprime_alt; varying float mie_angle; varying float steepness; @@ -30,27 +23,71 @@ varying float steepness; uniform float visibility; uniform float avisibility; uniform float scattering; -//uniform float ground_scattering; uniform float terminator; uniform float terrain_alt; uniform float hazeLayerAltitude; uniform float overcast; -//uniform float altitude; uniform float eye_alt; uniform float mysnowlevel; uniform float dust_cover_factor; +uniform float wetness; uniform float fogstructure; +uniform int quality_level; +uniform int tquality_level; const float EarthRadius = 5800000.0; const float terminator_width = 200000.0; float alt; +float eShade; -float luminance(vec3 color) -{ - return dot(vec3(0.212671, 0.715160, 0.072169), color); + + +float rand2D(in vec2 co){ + return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 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); +//return mix(a,b,x); +} + +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 Noise2D(in vec2 coord, in float wavelength) +{ +return interpolatedNoise2D(coord.x/wavelength, coord.y/wavelength); + +} + + float light_func (in float x, in float a, in float b, in float c, in float d, in float e) { @@ -76,7 +113,7 @@ float fade_mix; // for large altitude > 30 km, we switch to some component of quadratic distance fading to // create the illusion of improved visibility range -targ = 1.25 * targ; // need to sync with the distance to which terrain is drawn +targ = 1.25 * targ * smoothstep(0.04,0.06,targ); // need to sync with the distance to which terrain is drawn if (alt < 30000.0) @@ -96,18 +133,173 @@ else void main() { + + +float dist = length(relPos); + // this is taken from default.frag vec3 n; float NdotL, NdotHV, fogFactor; vec4 color = gl_Color; vec3 lightDir = gl_LightSource[0].position.xyz; vec3 halfVector = gl_LightSource[0].halfVector.xyz; + //vec3 halfVector = normalize(normalize(lightDir) + normalize(ecViewdir)); vec4 texel; vec4 snow_texel; + vec4 detail_texel; + vec4 mix_texel; vec4 fragColor; vec4 specular = vec4(0.0); float intensity; + +// get noise at different wavelengths + +// used: 5m, 5m gradient, 10m, 10m gradient: heightmap of the closeup terrain, 10m also snow +// 50m: detail texel +// 250m: detail texel +// 500m: distortion and overlay +// 1500m: overlay, detail, dust, fog +// 2000m: overlay, detail, snow, fog + +float noise_10m; +float noise_5m; +noise_10m = Noise2D(rawPos.xy, 10.0); +noise_5m = Noise2D(rawPos.xy ,5.0); + +float noisegrad_10m; +float noisegrad_5m; + +float noise_50m; +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); + + + + + +// + + +// get the texels + + texel = texture2D(texture, gl_TexCoord[0].st); + + float distortion_factor = 1.0; + vec2 stprime; + int flag = 1; + int mix_flag = 1; + + if (quality_level > 3) + { + snow_texel = texture2D(snow_texture, gl_TexCoord[0].st); + } + + if (tquality_level > 2) + { + mix_texel = texture2D(mix_texture, gl_TexCoord[0].st * 1.3); + if (mix_texel.a <0.1) {mix_flag = 0;} + } + + + if (tquality_level > 3) + { + stprime = vec2 (0.86*gl_TexCoord[0].s + 0.5*gl_TexCoord[0].t, 0.5*gl_TexCoord[0].s - 0.86*gl_TexCoord[0].t); + //distortion_factor = 0.9375 + (1.0 * nvL[2]); + distortion_factor = 0.97 + 0.06 * noise_500m; + stprime = stprime * distortion_factor * 15.0; + if (quality_level > 4) + { + stprime = stprime + normalize(relPos).xy * 0.02 * (noise_10m + 0.5 * noise_5m - 0.75); + } + detail_texel = texture2D(detail_texture, stprime); + if (detail_texel.a <0.1) {flag = 0;} + } + + +// texture preparation according to detail level + +// mix in hires texture patches + +float dist_fact; +float nSum; +float mix_factor; + +if (tquality_level > 2) + { + // first the second texture overlay + + + if (mix_flag == 1) + { + nSum = nSum + 0.2 * (2.0 * noise_2000m + 2.0 * noise_1500m + noise_500m); + nSum = nSum + 0.2 * (1.0 -smoothstep(0.9,0.95, abs(steepness))); + mix_factor = smoothstep(0.5, 0.54, nSum); + texel = mix(texel, mix_texel, mix_factor); + + } + + // then the detail texture overlay + } + +if (tquality_level > 3) + { + if (dist < 40000.0) + { + if (flag == 1) + { + noise_50m = Noise2D(rawPos.xy, 50.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.03 * (1.0 -smoothstep(0.9,0.95, abs(steepness))); + mix_factor = smoothstep(0.47, 0.54, nSum - dist_fact); + if (mix_factor > 0.8) {mix_factor = 0.8;} + texel = mix(texel, detail_texel,mix_factor); + } + } + } + + +vec4 dust_color; +float snow_alpha; + +if (quality_level > 3) + { + // mix dust + dust_color = vec4 (0.76, 0.71, 0.56, 1.0); + + texel = mix(texel, dust_color, clamp(0.5 * dust_cover_factor + 3.0 * dust_cover_factor * (((noise_1500m - 0.5) * 0.125)+0.125 ),0.0, 1.0) ); + + // mix snow + snow_alpha = smoothstep(0.75, 0.85, abs(steepness)); + texel = mix(texel, snow_texel, smoothstep(mysnowlevel, mysnowlevel+200.0, snow_alpha * (relPos.z + eye_alt)+ (noise_2000m + 0.1 * noise_10m -0.55) *400.0)); + } + + + +// get distribution of water when terrain is wet + +float water_threshold1; +float water_threshold2; +float water_factor =0.0; + + +if ((dist < 5000.0)&& (quality_level > 3) && (wetness>0.0)) + { + water_threshold1 = 1.0-0.5* wetness; + water_threshold2 = 1.0 - 0.3 * wetness; + water_factor = smoothstep(water_threshold1, water_threshold2 , (0.3 * (2.0 * (1.0-noise_10m) + (1.0 -noise_5m)) * (1.0 - smoothstep(2000.0, 5000.0, dist))) - 5.0 * (1.0 -steepness)); + } + +// darken wet terrain + + texel.rgb = texel.rgb * (1.0 - 0.6 * wetness); + + +// light computations vec4 light_specular = gl_LightSource[0].specular; @@ -118,62 +310,28 @@ void main() n = normalize(n); NdotL = dot(n, lightDir); + if ((tquality_level > 3) && (mix_flag ==1)&& (dist < 2000.0) && (quality_level > 4)) + { + noisegrad_10m = (noise_10m - Noise2D(rawPos.xy+ 0.05 * normalize(lightDir.xy),10.0))/0.05; + noisegrad_5m = (noise_5m - Noise2D(rawPos.xy+ 0.05 * normalize(lightDir.xy),5.0))/0.05; + NdotL = NdotL + 1.0 * (noisegrad_10m + 0.5* noisegrad_5m) * mix_factor/0.8 * (1.0 - smoothstep(1000.0, 2000.0, dist)); + } if (NdotL > 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 + specular.rgb = ((gl_FrontMaterial.specular.rgb + (water_factor * vec3 (1.0, 1.0, 1.0))) * light_specular.rgb - * pow(NdotHV, gl_FrontMaterial.shininess)); + * pow(NdotHV, gl_FrontMaterial.shininess + (20.0 * water_factor))); } color.a = diffuse_term.a; // This shouldn't be necessary, but our lighting becomes very // saturated. Clamping the color before modulating by the texture // is closer to what the OpenGL fixed function pipeline does. color = clamp(color, 0.0, 1.0); - texel = texture2D(texture, gl_TexCoord[0].st); - snow_texel = texture2D(snow_texture, gl_TexCoord[0].st); -// this is the snow and dust generating part, ger some noise vectors -vec4 noisevec = texture3D(NoiseTex, (rawPos.xyz)*0.003); // small scale noise -//vec4 nvL = texture3D(NoiseTex, (rawPos.xyz)*0.00066); -vec4 nvL = texture3D(NoiseTex, (rawPos.xyz)*0.0001); // large scale noise -vec4 nvR = texture3D(NoiseTex, (rawPos.xyz)*0.00003); // really large scale noise -//float ns=0.06; - // ns += nvL[0]*0.4; - //ns += nvL[1]*0.6; - //ns += nvL[2]*2.0; - //ns += nvL[3]*4.0; - //ns += noisevec[0]*0.1; - //ns += noisevec[1]*0.4; - - //ns += noisevec[2]*0.8; - //ns += noisevec[3]*2.1; - - // gradient effect for snow - - -// mix dust - vec4 dust_color = vec4 (0.76, 0.71, 0.56, 1.0); - //dust_color.rgb = dust_color.rgb * nvL[1]; - - texel = mix(texel, dust_color, clamp(0.5 * dust_cover_factor + 3.0 * dust_cover_factor * nvL[1],0.0, 1.0) ); - - - float snow_alpha = smoothstep(0.7, 0.8, abs(steepness)); - - //vec4 snow_texel = clamp(ns+nvL[2]*4.1+vec4(0.1, 0.1, nvL[2]*2.2, 1.0), 0.7, 1.0); - //snow_texel.a = snow_alpha * snow_texel.a; - - - - // mix snow - texel = mix(texel, snow_texel, smoothstep(mysnowlevel, mysnowlevel+200.0, snow_alpha * (relPos.z + eye_alt)+ (noisevec[1] * abs(noisevec[1])+ nvL[1])*1500.0)); - -// gradient - //fragColor = mix(vec4(ns-0.30, ns-0.29, ns-0.37, 1.0), fragColor, smoothstep(0.0, 0.40, steepness));// +nvL[2]*1.3)); fragColor = color * texel + specular; @@ -181,10 +339,10 @@ vec4 nvR = texture3D(NoiseTex, (rawPos.xyz)*0.00003); // really large scale no float delta_z = hazeLayerAltitude - eye_alt; -float dist = length(relPos); - -if (dist > 40.0) +if (dist > max(40.0, 0.04 * min(visibility,avisibility))) +//if ((gl_FragCoord.y > ylimit) || (gl_FragCoord.x < zlimit1) || (gl_FragCoord.x > zlimit2)) +//if (dist > 40.0) { alt = eye_alt; @@ -247,21 +405,33 @@ transmission_arg = (dist-distance_in_layer)/avisibility; float eqColorFactor; -//float scattering = ground_scattering + (1.0 - ground_scattering) * smoothstep(hazeLayerAltitude -100.0, hazeLayerAltitude + 100.0, relPos.z + eye_alt); if (visibility < avisibility) { - transmission_arg = transmission_arg + (distance_in_layer/(1.0 * visibility + 0.8 * visibility * fogstructure * (( 0.4 * nvL[1] + 0.6 * nvR[1]) -0.1) )); - //transmission_arg = transmission_arg + (distance_in_layer/visibility); + 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 -scattering); } else { - transmission_arg = transmission_arg + (distance_in_layer/(1.0 * avisibility + 0.8 * avisibility * fogstructure * (( 0.4 * nvL[1] + 0.6 * nvR[1]) -0.1) )); - //transmission_arg = transmission_arg + (distance_in_layer/avisibility); + 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 -scattering); } @@ -284,7 +454,7 @@ hazeColor.r = light_func(lightArg, 8.305e-06, 0.161, 3.827, 3.04e-05, 1.0); // now dim the light for haze -earthShade = 0.9 * smoothstep(terminator_width+ terminator, -terminator_width + terminator, yprime_alt) + 0.1; +eShade = 0.9 * smoothstep(terminator_width+ terminator, -terminator_width + terminator, yprime_alt) + 0.1; // Mie-like factor @@ -308,10 +478,9 @@ hazeColor.y = hazeColor.y * 0.9; // additional blue in indirect light float fade_out = max(0.65 - 0.3 *overcast, 0.45); intensity = length(hazeColor); -hazeColor = intensity * normalize(mix(hazeColor, 1.5* vec3 (0.45, 0.6, 0.8), 1.0 -smoothstep(0.25, fade_out,earthShade) )); +hazeColor = intensity * normalize(mix(hazeColor, 1.5* vec3 (0.45, 0.6, 0.8), 1.0 -smoothstep(0.25, fade_out,eShade) )); // change haze color to blue hue for strong fogging -//intensity = length(hazeColor); hazeColor = intensity * normalize(mix(hazeColor, 2.0 * vec3 (0.55, 0.6, 0.8), (1.0-smoothstep(0.3,0.8,eqColorFactor)))); @@ -320,32 +489,22 @@ hazeColor = intensity * normalize(mix(hazeColor, 2.0 * vec3 (0.55, 0.6, 0.8), ( float shadow = mix( min(1.0 + dot(normal,lightDir),1.0), 1.0, 1.0-smoothstep(0.1, 0.4, transmission)); hazeColor = mix(shadow * hazeColor, hazeColor, 0.3 + 0.7* smoothstep(250000.0, 400000.0, terminator)); -// randomness - -//hazeColor.rgb = hazeColor.rgb + 0.2 * hazeColor.rgb * nvL[1]; - -// determine the right mix of transmission and haze - -//fragColor.xyz = transmission * fragColor.xyz + (1.0-transmission) * eqColorFactor * hazeColor * earthShade; -//fragColor.rgb = mix(fragColor.rgb, vec3 (1.0, 1.0, 1.0), overcast ); - -fragColor.xyz = mix(eqColorFactor * hazeColor * earthShade, fragColor.xyz,transmission); +fragColor.xyz = mix(eqColorFactor * hazeColor * eShade, fragColor.xyz,transmission); gl_FragColor = fragColor; } -else // if dist < 40.0 no fogging at all +else // if dist < threshold no fogging at all { gl_FragColor = fragColor; } -//gl_FragColor.rgb = 5.0 * nvL[1] * vec3 (1.0, 1.0, 1.0); } diff --git a/Shaders/terrain-haze-detailed.vert b/Shaders/terrain-haze-detailed.vert index 7adfb8c66..429b890f1 100644 --- a/Shaders/terrain-haze-detailed.vert +++ b/Shaders/terrain-haze-detailed.vert @@ -21,18 +21,15 @@ varying vec4 diffuse_term; varying vec3 normal; varying vec3 relPos; -varying vec4 rawPos; +varying vec3 rawPos; +//varying vec3 ecViewdir; -varying float earthShade; -//varying float yprime; -//varying float vertex_alt; +//varying float earthShade; varying float yprime_alt; varying float mie_angle; varying float steepness; - - uniform int colorMode; uniform float hazeLayerAltitude; uniform float terminator; @@ -40,8 +37,10 @@ uniform float terrain_alt; uniform float avisibility; uniform float visibility; uniform float overcast; -//uniform float scattering; uniform float ground_scattering; +uniform float eye_alt; + +float earthShade; // This is the value used in the skydome scattering shader - use the same here for consistency? @@ -72,9 +71,10 @@ void main() float vertex_alt; float scattering; - rawPos = gl_Vertex; + rawPos = gl_Vertex.xyz; steepness = dot(normalize(gl_Normal), vec3 (0.0, 0.0, 1.0)); + // this code is copied from default.vert //vec4 ecPosition = gl_ModelViewMatrix * gl_Vertex; @@ -98,20 +98,41 @@ void main() // here start computations for the haze layer // we need several geometrical quantities - // first current altitude of eye position in model space + +// first current altitude of eye position in model space vec4 ep = gl_ModelViewMatrixInverse * vec4(0.0,0.0,0.0,1.0); // and relative position to vector relPos = gl_Vertex.xyz - ep.xyz; + + //ecViewdir = (gl_ModelViewMatrix * (ep - gl_Vertex)).xyz; // unfortunately, we need the distance in the vertex shader, although the more accurate version // is later computed in the fragment shader again float dist = length(relPos); + // altitude of the vertex in question, somehow zero leads to artefacts, so ensure it is at least 100m vertex_alt = max(gl_Vertex.z,100.0); scattering = ground_scattering + (1.0 - ground_scattering) * smoothstep(hazeLayerAltitude -100.0, hazeLayerAltitude + 100.0, vertex_alt); + + +// early culling of vertices which can't be seen due to ground haze despite being in aloft visibility range + +float delta_z = hazeLayerAltitude - eye_alt; +//if (((dist * (relPos.z - delta_z)/relPos.z > visibility ) && (relPos.z < 0.0) && (delta_z < 0.0) && (dist > 30000.0))) +if (0==1) + { + gl_Position = vec4(0.0, 0.0, -1000.0, 1.0); // move outside of view frustrum, gets culled before reaching fragment shader + earthShade = 1.0; + mie_angle = 1.0; + yprime_alt = 0.0; + } +else + { + + // branch dependent on daytime if (terminator < 1000000.0) // the full, sunrise and sunset computation @@ -164,13 +185,13 @@ if (terminator < 1000000.0) // the full, sunrise and sunset computation // correct ambient light intensity and hue before sunrise if (earthShade < 0.5) { - light_ambient = light_ambient * (0.4 + 0.6 * smoothstep(0.2, 0.5, earthShade)); + light_ambient = light_ambient * (0.7 + 0.3 * smoothstep(0.2, 0.5, earthShade)); intensity = length(light_ambient.xyz); - light_ambient.xyz = intensity * normalize(mix(light_ambient.xyz, vec3 (0.45, 0.6, 0.8), 1.0 -smoothstep(0.1, 0.5,earthShade) )); + light_ambient.xyz = intensity * normalize(mix(light_ambient.xyz, vec3 (0.45, 0.6, 0.8), 1.0 -smoothstep(0.1, 0.8,earthShade) )); intensity = length(light_diffuse.xyz); - light_diffuse.xyz = intensity * normalize(mix(light_diffuse.xyz, vec3 (0.45, 0.6, 0.8), 1.0 -smoothstep(0.1, 0.5,earthShade) )); + light_diffuse.xyz = intensity * normalize(mix(light_diffuse.xyz, vec3 (0.45, 0.6, 0.8), 1.0 -smoothstep(0.1, 0.7,earthShade) )); } @@ -224,6 +245,12 @@ else // the faster, full-day version without lightfields } +// a sky/earth irradiation map model - the sky creates much more diffuse radiation than the ground, so +// steep faces end up shaded more + +light_ambient = light_ambient * ((1.0+steepness)/2.0 * 1.2 + (1.0-steepness)/2.0 * 0.2); + + // default lighting based on texture and material using the light we have just computed diffuse_term = diffuse_color* light_diffuse; @@ -239,5 +266,8 @@ else // the faster, full-day version without lightfields // gl_FrontFacing in the fragment shader. gl_FrontColor.rgb = constant_term.rgb; gl_FrontColor.a = 1.0; gl_BackColor.rgb = constant_term.rgb; gl_BackColor.a = 0.0; + +} + } diff --git a/Shaders/terrain-haze.frag b/Shaders/terrain-haze.frag index 8db3f9b08..e2c14c8f8 100644 --- a/Shaders/terrain-haze.frag +++ b/Shaders/terrain-haze.frag @@ -6,18 +6,10 @@ varying vec4 diffuse_term; varying vec3 normal; varying vec3 relPos; -//varying vec3 hazeColor; -//varying float fogCoord; uniform sampler2D texture; -//varying float ct; -//varying float delta_z; -//varying float alt; -varying float earthShade; -//varying float yprime; -//varying float vertex_alt; varying float yprime_alt; varying float mie_angle; @@ -37,6 +29,7 @@ const float EarthRadius = 5800000.0; const float terminator_width = 200000.0; float alt; +float eShade; float luminance(vec3 color) { @@ -133,8 +126,8 @@ void main() float delta_z = hazeLayerAltitude - eye_alt; float dist = length(relPos); - -if (dist > 40.0) +if (dist > max(40.0, 0.04 * min(visibility,avisibility))) +//if (dist > 40.0) { alt = eye_alt; @@ -231,7 +224,7 @@ hazeColor.r = light_func(lightArg, 8.305e-06, 0.161, 3.827, 3.04e-05, 1.0); // now dim the light for haze -float eShade = earthShade; + eShade = 0.9 * smoothstep(terminator_width+ terminator, -terminator_width + terminator, yprime_alt) + 0.1; // Mie-like factor @@ -271,7 +264,6 @@ hazeColor = mix(shadow * hazeColor, hazeColor, 0.3 + 0.7* smoothstep(250000.0, 4 // determine the right mix of transmission and haze -//fragColor.xyz = transmission * fragColor.xyz + (1.0-transmission) * eqColorFactor * hazeColor * earthShade; fragColor.xyz = mix(eqColorFactor * hazeColor * eShade, fragColor.xyz,transmission); diff --git a/Shaders/terrain-haze.vert b/Shaders/terrain-haze.vert index fde08a6c7..09c83163e 100644 --- a/Shaders/terrain-haze.vert +++ b/Shaders/terrain-haze.vert @@ -22,7 +22,7 @@ varying vec4 diffuse_term; varying vec3 normal; varying vec3 relPos; -varying float earthShade; +//varying float earthShade; //varying float yprime; //varying float vertex_alt; varying float yprime_alt; @@ -46,6 +46,9 @@ uniform float ground_scattering; const float EarthRadius = 5800000.0; const float terminator_width = 200000.0; + +float earthShade; + float light_func (in float x, in float a, in float b, in float c, in float d, in float e) { //x = x - 0.5; @@ -159,13 +162,13 @@ if (terminator < 1000000.0) // the full, sunrise and sunset computation // correct ambient light intensity and hue before sunrise if (earthShade < 0.5) { - light_ambient = light_ambient * (0.4 + 0.6 * smoothstep(0.2, 0.5, earthShade)); + light_ambient = light_ambient * (0.7 + 0.3 * smoothstep(0.2, 0.5, earthShade)); intensity = length(light_ambient.xyz); - light_ambient.xyz = intensity * normalize(mix(light_ambient.xyz, vec3 (0.45, 0.6, 0.8), 1.0 -smoothstep(0.1, 0.5,earthShade) )); + light_ambient.xyz = intensity * normalize(mix(light_ambient.xyz, vec3 (0.45, 0.6, 0.8), 1.0 -smoothstep(0.1, 0.8,earthShade) )); intensity = length(light_diffuse.xyz); - light_diffuse.xyz = intensity * normalize(mix(light_diffuse.xyz, vec3 (0.45, 0.6, 0.8), 1.0 -smoothstep(0.1, 0.5,earthShade) )); + light_diffuse.xyz = intensity * normalize(mix(light_diffuse.xyz, vec3 (0.45, 0.6, 0.8), 1.0 -smoothstep(0.1, 0.7,earthShade) )); } diff --git a/Shaders/tree-haze.frag b/Shaders/tree-haze.frag index 92c6850b5..19b2b6637 100644 --- a/Shaders/tree-haze.frag +++ b/Shaders/tree-haze.frag @@ -1,23 +1,15 @@ // -*-C++-*- // written by Thorsten Renk, Oct 2011, based on default.frag -// Ambient term comes in gl_Color.rgb. -varying vec4 diffuse_term; -varying vec3 normal; + + + varying vec3 relPos; -//varying vec3 hazeColor; -//varying float fogCoord; uniform sampler2D texture; -//varying float ct; -//varying float delta_z; -//varying float alt; -varying float earthShade; -//varying float yprime; -//varying float vertex_alt; varying float yprime_alt; varying float mie_angle; @@ -25,14 +17,13 @@ varying float mie_angle; uniform float visibility; uniform float avisibility; uniform float scattering; -//uniform float ground_scattering; uniform float terminator; uniform float terrain_alt; uniform float hazeLayerAltitude; uniform float overcast; -//uniform float altitude; uniform float eye_alt; + const float EarthRadius = 5800000.0; const float terminator_width = 200000.0; @@ -68,7 +59,7 @@ float fade_mix; // for large altitude > 30 km, we switch to some component of quadratic distance fading to // create the illusion of improved visibility range -targ = 1.25 * targ; // need to sync with the distance to which terrain is drawn +targ = 1.25 * targ * smoothstep(0.07,0.1,targ); // need to sync with the distance to which terrain is drawn if (alt < 30000.0) @@ -88,43 +79,13 @@ else void main() { -// this is taken from default.frag - vec3 n; - float NdotL, NdotHV, fogFactor; - vec4 color = gl_Color; + + + vec3 lightDir = gl_LightSource[0].position.xyz; - vec3 halfVector = gl_LightSource[0].halfVector.xyz; - vec4 texel; - vec4 fragColor; - vec4 specular = vec4(0.0); float intensity; - - - vec4 light_specular = gl_LightSource[0].specular; - - // If gl_Color.a == 0, this is a back-facing polygon and the - // normal should be reversed. - n = (2.0 * gl_Color.a - 1.0) * normal; - n = normalize(n); - - NdotL = dot(n, lightDir); - if (NdotL > 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 - * light_specular.rgb - * pow(NdotHV, gl_FrontMaterial.shininess)); - } - color.a = diffuse_term.a; - // This shouldn't be necessary, but our lighting becomes very - // saturated. Clamping the color before modulating by the texture - // is closer to what the OpenGL fixed function pipeline does. - color = clamp(color, 0.0, 1.0); - texel = texture2D(texture, gl_TexCoord[0].st); - - fragColor = color * texel + specular; + vec4 fragColor = gl_Color * texture2D(texture, gl_TexCoord[0].st); @@ -134,8 +95,9 @@ void main() float delta_z = hazeLayerAltitude - eye_alt; float dist = length(relPos); - -if (dist > 40.0) +if (dist > max(40.0, 0.07 * min(visibility,avisibility))) +//if (dist > 40.0) +//if (0==1) { alt = eye_alt; @@ -232,8 +194,8 @@ hazeColor.r = light_func(lightArg, 8.305e-06, 0.161, 3.827, 3.04e-05, 1.0); // now dim the light for haze -float eShade = earthShade; -eShade = 0.9 * smoothstep(terminator_width+ terminator, -terminator_width + terminator, yprime_alt) + 0.1; +//float eShade = earthShade; +float eShade = 0.9 * smoothstep(terminator_width+ terminator, -terminator_width + terminator, yprime_alt) + 0.1; // Mie-like factor @@ -266,8 +228,8 @@ hazeColor = intensity * normalize(mix(hazeColor, 2.0 * vec3 (0.55, 0.6, 0.8), ( // reduce haze intensity when looking at shaded surfaces, only in terminator region -float shadow = mix( min(1.0 + dot(normal,lightDir),1.0), 1.0, 1.0-smoothstep(0.1, 0.4, transmission)); -hazeColor = mix(shadow * hazeColor, hazeColor, 0.3 + 0.7* smoothstep(250000.0, 400000.0, terminator)); +//float shadow = mix( min(1.0 + dot(normal,lightDir),1.0), 1.0, 1.0-smoothstep(0.1, 0.4, transmission)); +//hazeColor = mix(shadow * hazeColor, hazeColor, 0.3 + 0.7* smoothstep(250000.0, 400000.0, terminator)); // determine the right mix of transmission and haze diff --git a/Shaders/tree-haze.vert b/Shaders/tree-haze.vert index 76a127af2..b61df8266 100644 --- a/Shaders/tree-haze.vert +++ b/Shaders/tree-haze.vert @@ -18,11 +18,11 @@ // the surface normal is passed in gl_{Front,Back}Color. The alpha // component is set to 1 for front, 0 for back in order to work around // bugs with gl_FrontFacing in the fragment shader. -varying vec4 diffuse_term; -varying vec3 normal; +//varying vec4 diffuse_term; +//varying vec3 normal; varying vec3 relPos; -varying float earthShade; +//varying float earthShade; //varying float yprime; //varying float vertex_alt; varying float yprime_alt; @@ -38,6 +38,8 @@ uniform float overcast; //uniform float scattering; uniform float ground_scattering; +float earthShade; + // This is the value used in the skydome scattering shader - use the same here for consistency? const float EarthRadius = 5800000.0; const float terminator_width = 200000.0; @@ -90,7 +92,7 @@ void main() gl_Position = gl_ModelViewProjectionMatrix * vec4(position,1.0); vec3 ecPosition = vec3(gl_ModelViewMatrix * vec4(position, 1.0)); - normal = normalize(-ecPosition); + //normal = normalize(-ecPosition); float n = dot(normalize(gl_LightSource[0].position.xyz), normalize(-ecPosition)); @@ -228,20 +230,13 @@ else // the faster, full-day version without lightfields } -// default lighting based on texture and material using the light we have just computed +// tree shader lighting + + vec3 diffuse = gl_FrontMaterial.diffuse.rgb * max(0.1, n); + vec4 ambientColor = gl_FrontLightModelProduct.sceneColor + light_ambient * gl_FrontMaterial.ambient; + gl_FrontColor = ambientColor + light_diffuse * vec4(diffuse, 1.0); + + - diffuse_term = diffuse_color* light_diffuse; - vec4 constant_term = gl_FrontMaterial.emission + ambient_color * - (gl_LightModel.ambient + light_ambient); - // Super hack: if diffuse material alpha is less than 1, assume a - // transparency animation is at work - if (gl_FrontMaterial.diffuse.a < 1.0) - diffuse_term.a = gl_FrontMaterial.diffuse.a; - else - diffuse_term.a = gl_Color.a; - // Another hack for supporting two-sided lighting without using - // gl_FrontFacing in the fragment shader. - gl_FrontColor.rgb = constant_term.rgb; gl_FrontColor.a = 1.0; - gl_BackColor.rgb = constant_term.rgb; gl_BackColor.a = 0.0; } diff --git a/Shaders/trivial.frag b/Shaders/trivial.frag new file mode 100644 index 000000000..c4538ae04 --- /dev/null +++ b/Shaders/trivial.frag @@ -0,0 +1,12 @@ +// -*-C++-*- + + + + +void main() +{ + + gl_FragColor = vec4 (1.0, 1.0, 1.0, 1.0); + + +} diff --git a/Shaders/trivial.vert b/Shaders/trivial.vert new file mode 100644 index 000000000..f4240d0c6 --- /dev/null +++ b/Shaders/trivial.vert @@ -0,0 +1,18 @@ +// -*-C++-*- + +// Shader that uses OpenGL state values to do per-pixel lighting +// +// The only light used is gl_LightSource[0], which is assumed to be +// directional. +// +// Diffuse colors come from the gl_Color, ambient from the material. This is +// equivalent to osg::Material::DIFFUSE. +#version 120 +#define MODE_OFF 0 +#define MODE_DIFFUSE 1 +#define MODE_AMBIENT_AND_DIFFUSE 2 + +void main() +{ + gl_Position = ftransform(); +} diff --git a/Shaders/urban-lightfield.frag b/Shaders/urban-lightfield.frag new file mode 100644 index 000000000..1bd947488 --- /dev/null +++ b/Shaders/urban-lightfield.frag @@ -0,0 +1,537 @@ +// -*- mode: C; -*- +// Licence: GPL v2 +// Author: Frederic Bouvier. +// Adapted from the paper by F. Policarpo et al. : Real-time Relief Mapping on Arbitrary Polygonal Surfaces +// Adapted from the paper and sources by M. Drobot in GPU Pro : Quadtree Displacement Mapping with Height Blending + +#version 120 + +#extension GL_ATI_shader_texture_lod : enable +#extension GL_ARB_shader_texture_lod : enable + +#define TEXTURE_MIP_LEVELS 10 +#define TEXTURE_PIX_COUNT 1024 //pow(2,TEXTURE_MIP_LEVELS) +#define BINARY_SEARCH_COUNT 10 +#define BILINEAR_SMOOTH_FACTOR 2.0 + +varying vec3 rawpos; +varying vec4 ecPosition; +varying vec3 VNormal; +varying vec3 VTangent; +//varying vec3 VBinormal; +//varying vec3 Normal; +varying vec4 constantColor; +varying vec3 light_diffuse; +varying vec3 relPos; + +varying float yprime_alt; +varying float mie_angle; +//varying float steepness; + +uniform sampler3D NoiseTex; +uniform sampler2D BaseTex; +uniform sampler2D NormalTex; +uniform sampler2D QDMTex; +uniform float depth_factor; +uniform float tile_size; +uniform float quality_level; +uniform float visibility; +uniform float avisibility; +uniform float scattering; +uniform float terminator; +uniform float terrain_alt; +uniform float hazeLayerAltitude; +uniform float overcast; +uniform float eye_alt; +uniform float mysnowlevel; +uniform float dust_cover_factor; +uniform float wetness; +uniform float fogstructure; +uniform vec3 night_color; + +const float scale = 1.0; +int linear_search_steps = 10; +int GlobalIterationCount = 0; +int gIterationCap = 64; + +const float EarthRadius = 5800000.0; +const float terminator_width = 200000.0; + +float alt; +float eShade; + + +float rand2D(in vec2 co){ + return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453); +} + + +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 Noise2D(in vec2 coord, in float wavelength) +{ +return interpolatedNoise2D(coord.x/wavelength, coord.y/wavelength); + +} + + + +float light_func (in float x, in float a, in float b, in float c, in float d, in float e) +{ +x = x - 0.5; + +// use the asymptotics to shorten computations +if (x > 30.0) {return e;} +if (x < -15.0) {return 0.0;} + +return e / pow((1.0 + a * exp(-b * (x-c)) ),(1.0/d)); +} + +// this determines how light is attenuated in the distance +// physically this should be exp(-arg) but for technical reasons we use a sharper cutoff +// for distance > visibility + +float fog_func (in float targ) +{ + + +float fade_mix; + +// for large altitude > 30 km, we switch to some component of quadratic distance fading to +// create the illusion of improved visibility range + +targ = 1.25 * targ * smoothstep(0.04,0.06,targ); // need to sync with the distance to which terrain is drawn + + +if (alt < 30000.0) + {return exp(-targ - targ * targ * targ * targ);} +else if (alt < 50000.0) + { + fade_mix = (alt - 30000.0)/20000.0; + return fade_mix * exp(-targ*targ - pow(targ,4.0)) + (1.0 - fade_mix) * exp(-targ - pow(targ,4.0)); + } +else + { + return exp(- targ * targ - pow(targ,4.0)); + } + +} + + + + +void QDM(inout vec3 p, inout vec3 v) +{ + const int MAX_LEVEL = TEXTURE_MIP_LEVELS; + const float NODE_COUNT = TEXTURE_PIX_COUNT; + const float TEXEL_SPAN_HALF = 1.0 / NODE_COUNT / 2.0; + + float fDeltaNC = TEXEL_SPAN_HALF * depth_factor; + + vec3 p2 = p; + float level = MAX_LEVEL; + vec2 dirSign = (sign(v.xy) + 1.0) * 0.5; + GlobalIterationCount = 0; + float d = 0.0; + + while (level >= 0.0 && GlobalIterationCount < gIterationCap) + { + vec4 uv = vec4(p2.xyz, level); + d = texture2DLod(QDMTex, uv.xy, uv.w).w; + + if (d > p2.z) + { + //predictive point of ray traversal + vec3 tmpP2 = p + v * d; + + //current node count + float nodeCount = pow(2.0, (MAX_LEVEL - level)); + //current and predictive node ID + vec4 nodeID = floor(vec4(p2.xy, tmpP2.xy)*nodeCount); + + //check if we are crossing the current cell + if (nodeID.x != nodeID.z || nodeID.y != nodeID.w) + { + //calculate distance to nearest bound + vec2 a = p2.xy - p.xy; + vec2 p3 = (nodeID.xy + dirSign) / nodeCount; + vec2 b = p3.xy - p.xy; + + vec2 dNC = (b.xy * p2.z) / a.xy; + //take the nearest cell + d = min(d,min(dNC.x, dNC.y))+fDeltaNC; + + level++; + + //use additional convergence speed-up + #ifdef USE_QDM_ASCEND_INTERVAL + if(frac(level*0.5) > EPSILON) + level++; + #elseif USE_QDM_ASCEND_CONST + level++; + #endif + } + p2 = p + v * d; + } + level--; + GlobalIterationCount++; + } + + // + // Manual Bilinear filtering + // + float rayLength = length(p2.xy - p.xy) + fDeltaNC; + + float dA = p2.z * (rayLength - BILINEAR_SMOOTH_FACTOR * TEXEL_SPAN_HALF) / rayLength; + float dB = p2.z * (rayLength + BILINEAR_SMOOTH_FACTOR * TEXEL_SPAN_HALF) / rayLength; + + vec4 p2a = vec4(p + v * dA, 0.0); + vec4 p2b = vec4(p + v * dB, 0.0); + dA = texture2DLod(NormalTex, p2a.xy, p2a.w).w; + dB = texture2DLod(NormalTex, p2b.xy, p2b.w).w; + + dA = abs(p2a.z - dA); + dB = abs(p2b.z - dB); + + p2 = mix(p2a.xyz, p2b.xyz, dA / (dA + dB)); + + p = p2; +} + +float ray_intersect_QDM(vec2 dp, vec2 ds) +{ + vec3 p = vec3( dp, 0.0 ); + vec3 v = vec3( ds, 1.0 ); + QDM( p, v ); + return p.z; +} + +float ray_intersect_relief(vec2 dp, vec2 ds) +{ + float size = 1.0 / float(linear_search_steps); + float depth = 0.0; + float best_depth = 1.0; + + for(int i = 0; i < linear_search_steps - 1; ++i) + { + depth += size; + float t = step(0.95, texture2D(NormalTex, dp + ds * depth).a); + if(best_depth > 0.996) + if(depth >= t) + best_depth = depth; + } + depth = best_depth; + + const int binary_search_steps = 5; + + for(int i = 0; i < binary_search_steps; ++i) + { + size *= 0.5; + float t = step(0.95, texture2D(NormalTex, dp + ds * depth).a); + if(depth >= t) + { + best_depth = depth; + depth -= 2.0 * size; + } + depth += size; + } + + return(best_depth); +} + +float ray_intersect(vec2 dp, vec2 ds) +{ + if ( quality_level >= 4.0 ) + return ray_intersect_QDM( dp, ds ); + else + return ray_intersect_relief( dp, ds ); +} + +void main (void) +{ + if ( quality_level >= 3.0 ) { + linear_search_steps = 20; + } + vec3 normal = normalize(VNormal); + vec3 tangent = normalize(VTangent); + //vec3 binormal = normalize(VBinormal); + vec3 binormal = normalize(cross(normal, tangent)); + vec3 ecPos3 = ecPosition.xyz / ecPosition.w; + vec3 V = normalize(ecPos3); + vec3 s = vec3(dot(V, tangent), dot(V, binormal), dot(normal, -V)); + vec2 ds = s.xy * depth_factor / s.z; + vec2 dp = gl_TexCoord[0].st - ds; + float d = ray_intersect(dp, ds); + + vec2 uv = dp + ds * d; + vec3 N = texture2D(NormalTex, uv).xyz * 2.0 - 1.0; + + + float emis = N.z; + N.z = sqrt(1.0 - min(1.0,dot(N.xy, N.xy))); + float Nz = N.z; + N = normalize(N.x * tangent + N.y * binormal + N.z * normal); + + vec3 l = gl_LightSource[0].position.xyz; + vec3 diffuse = gl_Color.rgb * max(0.0, dot(N, l)); + float shadow_factor = 1.0; + + // Shadow + if ( quality_level >= 2.0 ) { + dp += ds * d; + vec3 sl = normalize( vec3( dot( l, tangent ), dot( l, binormal ), dot( -l, normal ) ) ); + ds = sl.xy * depth_factor / sl.z; + dp -= ds * d; + float dl = ray_intersect(dp, ds); + if ( dl < d - 0.05 ) + shadow_factor = dot( constantColor.xyz, vec3( 1.0, 1.0, 1.0 ) ) * 0.25; + } + // end shadow + + vec4 ambient_light = constantColor + vec4 (light_diffuse,1.0) * vec4(diffuse, 1.0); + float reflectance = ambient_light.r * 0.3 + ambient_light.g * 0.59 + ambient_light.b * 0.11; + if ( shadow_factor < 1.0 ) + ambient_light = constantColor + vec4(light_diffuse,1.0) * shadow_factor * vec4(diffuse, 1.0); + float emission_factor = (1.0 - smoothstep(0.15, 0.25, reflectance)) * emis; + vec4 tc = texture2D(BaseTex, uv); + emission_factor *= 0.5*pow(tc.r+0.8*tc.g+0.2*tc.b, 2.0) -0.2; + ambient_light += (emission_factor * vec4(night_color, 0.0)); + + + + vec4 finalColor = texture2D(BaseTex, uv); + + +// texel postprocessing by shader effects + + +// dust effect + +vec4 dust_color; + + +float noise_1500m = Noise2D(rawpos.xy, 1500.0); +float noise_2000m = Noise2D(rawpos.xy, 2000.0); + + +if (quality_level > 2) + { + // mix dust + dust_color = vec4 (0.76, 0.71, 0.56, 1.0); + + finalColor = mix(finalColor, dust_color, clamp(0.5 * dust_cover_factor + 3.0 * dust_cover_factor * (((noise_1500m - 0.5) * 0.125)+0.125 ),0.0, 1.0) ); + } + + +// darken wet terrain + + finalColor.rgb = finalColor.rgb * (1.0 - 0.6 * wetness); + + finalColor *= ambient_light; + + vec4 p = vec4( ecPos3 + tile_size * V * (d-1.0) * depth_factor / s.z, 1.0 ); + + //finalColor.rgb = fog_Func(finalColor.rgb, fogType); + + +// here comes the terrain haze model + +float dist = length(relPos); +float delta_z = hazeLayerAltitude - eye_alt; + + +if (dist > max(40.0, 0.04 * min(visibility,avisibility))) +{ + +alt = eye_alt; + + +float transmission; +float vAltitude; +float delta_zv; +float H; +float distance_in_layer; +float transmission_arg; +float intensity; +vec3 lightDir = gl_LightSource[0].position.xyz; + +// angle with horizon +float ct = dot(vec3(0.0, 0.0, 1.0), relPos)/dist; + + +// we solve the geometry what part of the light path is attenuated normally and what is through the haze layer + +if (delta_z > 0.0) // we're inside the layer + { + if (ct < 0.0) // we look down + { + distance_in_layer = dist; + vAltitude = min(distance_in_layer,min(visibility, avisibility)) * ct; + delta_zv = delta_z - vAltitude; + } + else // we may look through upper layer edge + { + H = dist * ct; + if (H > delta_z) {distance_in_layer = dist/H * delta_z;} + else {distance_in_layer = dist;} + vAltitude = min(distance_in_layer,visibility) * ct; + delta_zv = delta_z - vAltitude; + } + } + else // we see the layer from above, delta_z < 0.0 + { + H = dist * -ct; + if (H < (-delta_z)) // we don't see into the layer at all, aloft visibility is the only fading + { + distance_in_layer = 0.0; + delta_zv = 0.0; + } + else + { + vAltitude = H + delta_z; + distance_in_layer = vAltitude/H * dist; + vAltitude = min(distance_in_layer,visibility) * (-ct); + delta_zv = vAltitude; + } + } + + +// ground haze cannot be thinner than aloft visibility in the model, +// so we need to use aloft visibility otherwise + + +transmission_arg = (dist-distance_in_layer)/avisibility; + + +float eqColorFactor; + + + +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 -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 -scattering); + } + + + +transmission = fog_func(transmission_arg); + +// there's always residual intensity, we should never be driven to zero +if (eqColorFactor < 0.2) eqColorFactor = 0.2; + + +float lightArg = (terminator-yprime_alt)/100000.0; + +vec3 hazeColor; + +hazeColor.b = light_func(lightArg, 1.330e-05, 0.264, 2.527, 1.08e-05, 1.0); +hazeColor.g = light_func(lightArg, 3.931e-06, 0.264, 3.827, 7.93e-06, 1.0); +hazeColor.r = light_func(lightArg, 8.305e-06, 0.161, 3.827, 3.04e-05, 1.0); + + +// now dim the light for haze +eShade = 0.9 * smoothstep(terminator_width+ terminator, -terminator_width + terminator, yprime_alt) + 0.1; + +// Mie-like factor + +if (lightArg < 5.0) + {intensity = length(hazeColor); + float mie_magnitude = 0.5 * smoothstep(350000.0, 150000.0, terminator-sqrt(2.0 * EarthRadius * terrain_alt)); + hazeColor = intensity * ((1.0 - mie_magnitude) + mie_magnitude * mie_angle) * normalize(mix(hazeColor, vec3 (0.5, 0.58, 0.65), mie_magnitude * (0.5 - 0.5 * mie_angle)) ); + } + +// high altitude desaturation of the haze color + +intensity = length(hazeColor); +hazeColor = intensity * normalize (mix(hazeColor, intensity * vec3 (1.0,1.0,1.0), 0.7* smoothstep(5000.0, 50000.0, alt))); + +// blue hue of haze + +hazeColor.x = hazeColor.x * 0.83; +hazeColor.y = hazeColor.y * 0.9; + + +// additional blue in indirect light +float fade_out = max(0.65 - 0.3 *overcast, 0.45); +intensity = length(hazeColor); +hazeColor = intensity * normalize(mix(hazeColor, 1.5* vec3 (0.45, 0.6, 0.8), 1.0 -smoothstep(0.25, fade_out,eShade) )); + +// change haze color to blue hue for strong fogging +hazeColor = intensity * normalize(mix(hazeColor, 2.0 * vec3 (0.55, 0.6, 0.8), (1.0-smoothstep(0.3,0.8,eqColorFactor)))); + + +// reduce haze intensity when looking at shaded surfaces, only in terminator region + +float shadow = mix( min(1.0 + dot(VNormal,lightDir),1.0), 1.0, 1.0-smoothstep(0.1, 0.4, transmission)); +hazeColor = mix(shadow * hazeColor, hazeColor, 0.3 + 0.7* smoothstep(250000.0, 400000.0, terminator)); + + + + +finalColor.xyz = mix(eqColorFactor * hazeColor * eShade, finalColor.xyz,transmission); +gl_FragColor = finalColor; + +} +else // if dist < threshold no fogging at all +{ +gl_FragColor = finalColor; +} + + + // gl_FragColor = finalColor; + + if (dot(normal,-V) > 0.1) { + vec4 iproj = gl_ProjectionMatrix * p; + iproj /= iproj.w; + gl_FragDepth = (iproj.z+1.0)/2.0; + } else { + gl_FragDepth = gl_FragCoord.z; + } +} diff --git a/Shaders/urban-lightfield.vert b/Shaders/urban-lightfield.vert new file mode 100644 index 000000000..8e851f924 --- /dev/null +++ b/Shaders/urban-lightfield.vert @@ -0,0 +1,279 @@ +// -*-C++-*- + +// Shader that uses OpenGL state values to do per-pixel lighting +// +// The only light used is gl_LightSource[0], which is assumed to be +// directional. +// +// Diffuse colors come from the gl_Color, ambient from the material. This is +// equivalent to osg::Material::DIFFUSE. +// Haze part added by Thorsten Renk, Oct. 2011 + + +#define MODE_OFF 0 +#define MODE_DIFFUSE 1 +#define MODE_AMBIENT_AND_DIFFUSE 2 + +// The constant term of the lighting equation that doesn't depend on +// the surface normal is passed in gl_{Front,Back}Color. The alpha +// component is set to 1 for front, 0 for back in order to work around +// bugs with gl_FrontFacing in the fragment shader. + + +varying vec3 relPos; +varying vec3 rawPos; + +varying vec3 VNormal; +//varying vec3 Normal; +varying vec3 VTangent; +//varying vec3 VBinormal; +varying vec4 ecPosition; +varying vec4 constantColor; +varying vec3 light_diffuse; + + +varying float yprime_alt; +varying float mie_angle; +//varying float steepness; + + +uniform int colorMode; +uniform float hazeLayerAltitude; +uniform float terminator; +uniform float terrain_alt; +uniform float avisibility; +uniform float visibility; +uniform float overcast; +uniform float ground_scattering; +uniform float eye_alt; + + +attribute vec3 tangent;//, binormal; + +float earthShade; +float steepness; + +// This is the value used in the skydome scattering shader - use the same here for consistency? +const float EarthRadius = 5800000.0; +const float terminator_width = 200000.0; + +float light_func (in float x, in float a, in float b, in float c, in float d, in float e) +{ +//x = x - 0.5; + +// use the asymptotics to shorten computations +if (x < -15.0) {return 0.0;} + +return e / pow((1.0 + a * exp(-b * (x-c)) ),(1.0/d)); +} + + +void main() +{ + + + vec4 light_ambient; + + //float yprime_alt; + float yprime; + float lightArg; + float intensity; + float vertex_alt; + float scattering; + + rawPos = 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; +// Normal = normalize(gl_Normal); + VTangent = gl_NormalMatrix * tangent; +// VBinormal = gl_NormalMatrix * binormal; + + +// this code is copied from default.vert + + //vec4 ecPosition = gl_ModelViewMatrix * gl_Vertex; + gl_Position = ftransform(); + gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0; + //normal = gl_NormalMatrix * gl_Normal; + vec4 ambient_color, diffuse_color; + if (colorMode == MODE_DIFFUSE) { + diffuse_color = gl_Color; + ambient_color = gl_FrontMaterial.ambient; + } else if (colorMode == MODE_AMBIENT_AND_DIFFUSE) { + diffuse_color = gl_Color; + ambient_color = gl_Color; + } else { + diffuse_color = gl_FrontMaterial.diffuse; + ambient_color = gl_FrontMaterial.ambient; + } + + + + // here start computations for the haze layer + // we need several geometrical quantities + + +// first current altitude of eye position in model space + vec4 ep = gl_ModelViewMatrixInverse * vec4(0.0,0.0,0.0,1.0); + + // and relative position to vector + relPos = gl_Vertex.xyz - ep.xyz; + + // unfortunately, we need the distance in the vertex shader, although the more accurate version + // is later computed in the fragment shader again + float dist = length(relPos); + + + // altitude of the vertex in question, somehow zero leads to artefacts, so ensure it is at least 100m + vertex_alt = max(gl_Vertex.z,100.0); + scattering = ground_scattering + (1.0 - ground_scattering) * smoothstep(hazeLayerAltitude -100.0, hazeLayerAltitude + 100.0, vertex_alt); + + + +// early culling of vertices which can't be seen due to ground haze despite being in aloft visibility range + +float delta_z = hazeLayerAltitude - eye_alt; +//if (((dist * (relPos.z - delta_z)/relPos.z > visibility ) && (relPos.z < 0.0) && (delta_z < 0.0) && (dist > 30000.0))) +if (0==1) + { + gl_Position = vec4(0.0, 0.0, -1000.0, 1.0); // move outside of view frustrum, gets culled before reaching fragment shader + earthShade = 1.0; + mie_angle = 1.0; + yprime_alt = 0.0; + } +else + { + + + // branch dependent on daytime + +if (terminator < 1000000.0) // the full, sunrise and sunset computation +{ + + + // establish coordinates relative to sun position + + vec3 lightFull = (gl_ModelViewMatrixInverse * gl_LightSource[0].position).xyz; + vec3 lightHorizon = normalize(vec3(lightFull.x,lightFull.y, 0.0)); + + + + // yprime is the distance of the vertex into sun direction + yprime = -dot(relPos, lightHorizon); + + // this gets an altitude correction, higher terrain gets to see the sun earlier + yprime_alt = yprime - sqrt(2.0 * EarthRadius * vertex_alt); + + // two times terminator width governs how quickly light fades into shadow + // now the light-dimming factor + earthShade = 0.6 * (1.0 - smoothstep(-terminator_width+ terminator, terminator_width + terminator, yprime_alt)) + 0.4; + + // parametrized version of the Flightgear ground lighting function + lightArg = (terminator-yprime_alt)/100000.0; + + // directional scattering for low sun + if (lightArg < 5.0) + {mie_angle = (0.5 * dot(normalize(relPos), normalize(lightFull)) ) + 0.5;} + else + {mie_angle = 1.0;} + + + + + light_diffuse.b = light_func(lightArg, 1.330e-05, 0.264, 3.827, 1.08e-05, 1.0); + light_diffuse.g = light_func(lightArg, 3.931e-06, 0.264, 3.827, 7.93e-06, 1.0); + light_diffuse.r = light_func(lightArg, 8.305e-06, 0.161, 3.827, 3.04e-05, 1.0); + + light_diffuse = light_diffuse * scattering; + + light_ambient.b = light_func(lightArg, 0.000506, 0.131, -3.315, 0.000457, 0.5); + light_ambient.g = light_func(lightArg, 2.264e-05, 0.134, 0.967, 3.66e-05, 0.4); + light_ambient.r = light_func(lightArg, 0.236, 0.253, 1.073, 0.572, 0.33); + light_ambient.a = 0.0; + + + + +// correct ambient light intensity and hue before sunrise +if (earthShade < 0.5) + { + light_ambient = light_ambient * (0.7 + 0.3 * smoothstep(0.2, 0.5, earthShade)); + intensity = length(light_ambient.xyz); + + light_ambient.xyz = intensity * normalize(mix(light_ambient.xyz, vec3 (0.45, 0.6, 0.8), 1.0 -smoothstep(0.1, 0.8,earthShade) )); + + intensity = length(light_diffuse.xyz); + light_diffuse.xyz = intensity * normalize(mix(light_diffuse.xyz, vec3 (0.45, 0.6, 0.8), 1.0 -smoothstep(0.1, 0.7,earthShade) )); + } + + +// the haze gets the light at the altitude of the haze top if the vertex in view is below +// but the light at the vertex if the vertex is above + +vertex_alt = max(vertex_alt,hazeLayerAltitude); + +if (vertex_alt > hazeLayerAltitude) + { + if (dist > 0.8 * avisibility) + { + vertex_alt = mix(vertex_alt, hazeLayerAltitude, smoothstep(0.8*avisibility, avisibility, dist)); + yprime_alt = yprime -sqrt(2.0 * EarthRadius * vertex_alt); + } + } +else + { + vertex_alt = hazeLayerAltitude; + yprime_alt = yprime -sqrt(2.0 * EarthRadius * vertex_alt); + } + +} +else // the faster, full-day version without lightfields +{ + //vertex_alt = max(gl_Vertex.z,100.0); + + earthShade = 1.0; + mie_angle = 1.0; + + if (terminator > 3000000.0) + {light_diffuse = vec3 (1.0, 1.0, 1.0); + light_ambient = vec4 (0.33, 0.4, 0.5, 0.0); } + else + { + + lightArg = (terminator/100000.0 - 10.0)/20.0; + light_diffuse.b = 0.78 + lightArg * 0.21; + light_diffuse.g = 0.907 + lightArg * 0.091; + light_diffuse.r = 0.904 + lightArg * 0.092; + + light_ambient.b = 0.41 + lightArg * 0.08; + light_ambient.g = 0.333 + lightArg * 0.06; + light_ambient.r = 0.316 + lightArg * 0.016; + + } + + light_diffuse = light_diffuse * scattering; + yprime_alt = -sqrt(2.0 * EarthRadius * hazeLayerAltitude); +} + + +// a sky/earth irradiation map model - the sky creates much more diffuse radiation than the ground, so +// steep faces end up shaded more + +light_ambient = light_ambient * ((1.0+steepness)/2.0 * 1.2 + (1.0-steepness)/2.0 * 0.2); + + +// default lighting based on texture and material using the light we have just computed + + gl_FrontColor = gl_Color; + constantColor = gl_FrontMaterial.emission + + gl_Color * (gl_LightModel.ambient + light_ambient); + + + + + +} + +} + diff --git a/Shaders/urban.frag b/Shaders/urban.frag index 1714ac15e..cd02ea14c 100644 --- a/Shaders/urban.frag +++ b/Shaders/urban.frag @@ -18,7 +18,7 @@ varying vec4 rawpos; varying vec4 ecPosition; varying vec3 VNormal; varying vec3 VTangent; -varying vec3 VBinormal; +//varying vec3 VBinormal; varying vec3 Normal; varying vec4 constantColor; @@ -177,7 +177,8 @@ void main (void) } vec3 normal = normalize(VNormal); vec3 tangent = normalize(VTangent); - vec3 binormal = normalize(VBinormal); + //vec3 binormal = normalize(VBinormal); + vec3 binormal = normalize(cross(normal, tangent)); vec3 ecPos3 = ecPosition.xyz / ecPosition.w; vec3 V = normalize(ecPos3); vec3 s = vec3(dot(V, tangent), dot(V, binormal), dot(normal, -V)); diff --git a/Shaders/urban.vert b/Shaders/urban.vert index 3e23e8ba5..284ce5e18 100644 --- a/Shaders/urban.vert +++ b/Shaders/urban.vert @@ -7,10 +7,10 @@ varying vec4 ecPosition; varying vec3 VNormal; varying vec3 Normal; varying vec3 VTangent; -varying vec3 VBinormal; +//varying vec3 VBinormal; varying vec4 constantColor; -attribute vec3 tangent, binormal; +attribute vec3 tangent;//, binormal; ////fog "include"//////// // uniform int fogType; diff --git a/Textures/Terrain/dirtrock.png b/Textures/Terrain/dirtrock.png new file mode 100644 index 0000000000000000000000000000000000000000..a45a941f35108435aecec0f6155d5e60dc0670f2 GIT binary patch literal 118638 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 XN=hdBi3a;+00000NkvXXu0mjfu|jyh literal 0 HcmV?d00001 diff --git a/Textures/Terrain/void.png b/Textures/Terrain/void.png new file mode 100644 index 0000000000000000000000000000000000000000..233d25edad5f173ba762b38531a7140d0d53add1 GIT binary patch literal 251 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSjKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPgf + + 5 + 60 + + + + + 120 + 60 + + + + + 190 + 60 + 90 + 20 + 0.0 + 0.7 + /environment/surface/wetness + + dialog-apply + + + + + 290 + 60 + + + + 10 10 diff --git a/gui/dialogs/shaders-lightfield.xml b/gui/dialogs/shaders-lightfield.xml index b89158f73..f477c769b 100644 --- a/gui/dialogs/shaders-lightfield.xml +++ b/gui/dialogs/shaders-lightfield.xml @@ -71,6 +71,60 @@ + + hbox + right + + + left + + + + transition + 0.0 + 5.0 + 1.0 + 0.17 + true + /sim/rendering/shaders/transition + + dialog-apply + transition + + + + 55 + + + + + + hbox + right + + + left + + + + urban + 0.0 + 5.0 + 1.0 + 0.17 + true + /sim/rendering/shaders/urban + + dialog-apply + urban + + + + 55 + + + + hbox right