diff --git a/Effects/terrain-default.eff b/Effects/terrain-default.eff index 27eed7f74..4935b4dfb 100644 --- a/Effects/terrain-default.eff +++ b/Effects/terrain-default.eff @@ -290,6 +290,7 @@ Shaders/terrain-haze-ultra.vert Shaders/terrain-haze-ultra.frag + Shaders/noise.frag Shaders/cloud-shadowfunc.frag diff --git a/Shaders/terrain-haze-ultra.frag b/Shaders/terrain-haze-ultra.frag index 8398c48ad..172e7a879 100644 --- a/Shaders/terrain-haze-ultra.frag +++ b/Shaders/terrain-haze-ultra.frag @@ -69,120 +69,12 @@ float yprime_alt; float mie_angle; float shadow_func (in float x, in float y, in float noise, in float dist); - -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 DotNoise2D(in vec2 coord, in float wavelength, in float fractionalMaxDotSize, in float dot_density); +float Noise2D(in vec2 coord, in float wavelength); +float Noise3D(in vec3 coord, in float wavelength); +float VoronoiNoise2D(in vec2 coord, in float wavelength, in float xrand, in float yrand); - 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 dotNoise2D(in float x, in float y, in float fractionalMaxDotSize) -{ - float integer_x = x - fract(x); - float fractional_x = x - integer_x; - - float integer_y = y - fract(y); - float fractional_y = y - integer_y; - - if (rand2D(vec2(integer_x+1.0, integer_y +1.0)) > dot_density) - {return 0.0;} - - float xoffset = (rand2D(vec2(integer_x, integer_y)) -0.5); - float yoffset = (rand2D(vec2(integer_x+1.0, integer_y)) - 0.5); - float dotSize = 0.5 * fractionalMaxDotSize * max(0.25,rand2D(vec2(integer_x, integer_y+1.0))); - - - vec2 truePos = vec2 (0.5 + xoffset * (1.0 - 2.0 * dotSize) , 0.5 + yoffset * (1.0 -2.0 * dotSize)); - - float distance = length(truePos - vec2(fractional_x, fractional_y)); - - return 1.0 - smoothstep (0.3 * dotSize, 1.0* dotSize, distance); -} - -float DotNoise2D(in vec2 coord, in float wavelength, in float fractionalMaxDotSize) -{ -return dotNoise2D(coord.x/wavelength, coord.y/wavelength, fractionalMaxDotSize); -} @@ -339,9 +231,9 @@ float noise_2000m = Noise3D(worldPos.xyz, 2000.0); // dot noise -float dotnoise_2m = DotNoise2D(rawPos.xy, 2.0 * dot_size,0.5); -float dotnoise_10m = DotNoise2D(rawPos.xy, 10.0 * dot_size, 0.5); -float dotnoise_15m = DotNoise2D(rawPos.xy, 15.0 * dot_size, 0.33); +float dotnoise_2m = DotNoise2D(rawPos.xy, 2.0 * dot_size,0.5, dot_density); +float dotnoise_10m = DotNoise2D(rawPos.xy, 10.0 * dot_size, 0.5, dot_density); +float dotnoise_15m = DotNoise2D(rawPos.xy, 15.0 * dot_size, 0.33, dot_density); float dotnoisegrad_10m; @@ -540,7 +432,7 @@ if ((dist < 5000.0)&& (quality_level > 3) && (combined_wetness>0.0)) noisegrad_2m = (noise_2m - Noise2D(rawPos.xy+ 0.05 * normalize(lightDir.xy),2.0))/0.05; noisegrad_1m = (noise_1m - Noise2D(rawPos.xy+ 0.05 * normalize(lightDir.xy),1.0))/0.05; - dotnoisegrad_10m = (dotnoise_10m - DotNoise2D(rawPos.xy+ 0.05 * normalize(lightDir.xy),10.0 * dot_size,0.5))/0.05; + dotnoisegrad_10m = (dotnoise_10m - DotNoise2D(rawPos.xy+ 0.05 * normalize(lightDir.xy),10.0 * dot_size,0.5, dot_density))/0.05; NdotL = NdotL + (noisegrad_10m * detail_fade(10.0, view_angle,dist) + 0.5* noisegrad_5m * detail_fade(5.0, view_angle,dist)) * mix_factor/0.8;