1
0
Fork 0

Vertically stratified noise function for ALS

This commit is contained in:
Thorsten Renk 2014-05-14 13:01:14 +03:00
parent 27438ea54c
commit 17799e8450
5 changed files with 146 additions and 18 deletions

View file

@ -92,6 +92,7 @@
<dot_density>1.0</dot_density>
<dot_size>1.0</dot_size>
<dust_resistance>1.0</dust_resistance>
<rock_strata>0</rock_strata>
<visibility><use>/environment/ground-visibility-m</use></visibility>
<avisibility><use>/environment/visibility-m</use></avisibility>
<lthickness><use>/environment/ground-haze-thickness-m</use></lthickness>
@ -658,6 +659,11 @@
<type>int</type>
<value><use>cloud_shadow_flag</use></value>
</uniform>
<uniform>
<name>rock_strata</name>
<type>int</type>
<value><use>rock_strata</use></value>
</uniform>
<uniform>
<name>texture</name>
<type>sampler-2d</type>

View file

@ -3076,6 +3076,7 @@
</texture-set>
<parameters>
<transition_model>0.5</transition_model>
<rock_strata>1</rock_strata>
</parameters>
<xsize>2000</xsize>
<ysize>2000</ysize>
@ -3100,6 +3101,7 @@
</texture-set>
<parameters>
<transition_model>0.5</transition_model>
<rock_strata>1</rock_strata>
</parameters>
<xsize>2000</xsize>
<ysize>2000</ysize>
@ -3124,6 +3126,7 @@
</texture-set>
<parameters>
<transition_model>0.5</transition_model>
<rock_strata>1</rock_strata>
</parameters>
<xsize>2000</xsize>
<ysize>2000</ysize>
@ -3148,6 +3151,7 @@
</texture-set>
<parameters>
<dot_size>10.0</dot_size>
<rock_strata>1</rock_strata>
</parameters>
<object-mask>Terrain/drycrop1.mask.png</object-mask>
<object-mask>Terrain/drycrop2.mask.png</object-mask>
@ -3169,6 +3173,78 @@
<tree-width-m>12.0</tree-width-m>
</material>
<material include="Materials/regions/south_africa.xml">
<name>DryCropPastureCover</name>
<name>DryCrop</name>
<texture-set>
<texture>Terrain/dry_pasture4.png</texture>
<texture n="12">Terrain/dirtrock.png</texture>
<texture n="15">Terrain/tundra-hawaii-green.png</texture>
</texture-set>
<parameters>
<dot_size>10.0</dot_size>
<rock_strata>1</rock_strata>
</parameters>
<object-mask>Terrain/drycrop1.mask.png</object-mask>
<object-mask>Terrain/drycrop2.mask.png</object-mask>
<object-mask>Terrain/drycrop3.mask.png</object-mask>
<xsize>2000</xsize>
<ysize>2000</ysize>
<solid>1</solid>
<friction-factor>0.9</friction-factor>
<rolling-friction>0.1</rolling-friction>
<bumpiness>0.6</bumpiness>
<load-resistance>1e30</load-resistance>
<light-coverage>2000000.0</light-coverage>
<object-group include="Materials/base/farm-buildings.xml"/>
<wood-coverage>10000.0</wood-coverage>
<tree-texture>Trees/mixed.png</tree-texture>
<tree-varieties>8</tree-varieties>
<tree-range-m alias="/params/forest/tree-range-m"/>
<tree-height-m>20.0</tree-height-m>
<tree-width-m>12.0</tree-width-m>
</material>
<material include="Materials/regions/south_africa.xml">
<effect>Effects/cropgrass</effect>
<name>Grassland</name>
<texture-set>
<texture>Terrain/dry_pasture4.png</texture>
<texture n="12">Terrain/tundra-hawaii-green.png</texture>
</texture-set>
<parameters>
<rock_strata>1</rock_strata>
</parameters>
<xsize>2000</xsize>
<ysize>2000</ysize>
<light-coverage>2000000.0</light-coverage>
<diffuse>
<r>0.93</r>
<g>0.95</g>
<b>0.93</b>
<a>1.0</a>
</diffuse>
<specular>
<r>0.1</r>
<g>0.12</g>
<b>0.1</b>
<a>1.0</a>
</specular>
<shininess>1.2</shininess>
<solid>1</solid>
<friction-factor>0.7</friction-factor>
<rolling-friction>0.1</rolling-friction>
<bumpiness>0.3</bumpiness>
<load-resistance>1e30</load-resistance>
<wood-coverage>150000.0</wood-coverage>
<tree-texture>Trees/mixed.png</tree-texture>
<tree-varieties>8</tree-varieties>
<tree-range-m alias="/params/forest/tree-range-m"/>
<tree-height-m>20.0</tree-height-m>
<tree-width-m>12.0</tree-width-m>
</material>
<!-- REGIONAL DEFINITIONS - ASIA -->
<!-- Regional Asian irrigated crops -->

View file

@ -70,7 +70,7 @@ float shadow_func (in float x, in float y, in float noise, in float dist);
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 slopeLines2D(in vec2 coord, in vec2 gradDir, in float wavelength, in float steepness);
float SlopeLines2D(in vec2 coord, in vec2 gradDir, in float wavelength, in float steepness);
@ -235,8 +235,8 @@ float vnoise_rotation = VoronoiNoise2D(rawPos.xy, rotation_scale, distortion_fac
// slope noise
float slopenoise_50m = slopeLines2D(rawPos, grad_dir, 50.0, steepness);
float slopenoise_100m = slopeLines2D(rawPos, grad_dir, 100.0, steepness);
float slopenoise_50m = SlopeLines2D(rawPos, grad_dir, 50.0, steepness);
float slopenoise_100m = SlopeLines2D(rawPos, grad_dir, 100.0, steepness);
float snownoise_25m = mix(noise_25m, slopenoise_50m, clamp(3.0*(1.0-steepness),0.0,1.0));
float snownoise_50m = mix(noise_50m, slopenoise_100m, clamp(3.0*(1.0-steepness),0.0,1.0));

View file

@ -10,9 +10,11 @@
// * VoronoiNoise2D(in vec2 coord, in float wavelength, in float xrand, in float yrand)
// is a function mapping the terrain into random domains, based on Voronoi tiling of a regular grid
// distorted with xrand and yrand
// * slopeLines2D(in vec2 coord, in vec2 gradDir, in float wavelength, in float steepness)
// * SlopeLines2D(in vec2 coord, in vec2 gradDir, in float wavelength, in float steepness)
// computes a semi-random set of lines along the direction of steepest descent, allowing to
// simulate e.g. water erosion patterns
// * Strata3D(in vec3 coord, in float wavelength, in float variation)
// computers a vertically stratified random pattern, appropriate e.g. for rock textures
// Thorsten Renk 2014
@ -218,7 +220,35 @@ float slopeLines2D(in float x, in float y, in float sx, in float sy, in float st
}
float slopeLines2D(in vec2 coord, in vec2 gradDir, in float wavelength, in float steepness)
float SlopeLines2D(in vec2 coord, in vec2 gradDir, in float wavelength, in float steepness)
{
return slopeLines2D(coord.x/wavelength, coord.y/wavelength, gradDir.x, gradDir.y, steepness);
}
float strata3D(in float x, in float y, in float z, in float variation)
{
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 rand_value_low = rand3D(vec3(0.0, 0.0, integer_z));
float rand_value_high = rand3D(vec3(0.0, 0.0, integer_z+1));
float rand_var = 0.5 - variation + 2.0 * variation * rand3D(vec3(integer_x, integer_y, integer_z));
return (1.0 - smoothstep(rand_var -0.15, rand_var + 0.15, fract(z))) * rand_value_low + smoothstep(rand_var-0.15, rand_var + 0.15, fract(z)) * rand_value_high;
}
float Strata3D(in vec3 coord, in float wavelength, in float variation)
{
return strata3D(coord.x/wavelength, coord.y/wavelength, coord.z/wavelength, variation);
}

View file

@ -57,6 +57,7 @@ uniform int quality_level;
uniform int tquality_level;
uniform int wind_effects;
uniform int cloud_shadow_flag;
uniform int rock_strata;
const float EarthRadius = 5800000.0;
const float terminator_width = 200000.0;
@ -70,8 +71,8 @@ float shadow_func (in float x, in float y, in float noise, in float dist);
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 slopeLines2D(in vec2 coord, in vec2 gradDir, in float wavelength, in float steepness);
float SlopeLines2D(in vec2 coord, in vec2 gradDir, in float wavelength, in float steepness);
float Strata3D(in vec3 coord, in float wavelength, in float variation);
@ -237,8 +238,8 @@ float dotnoisegrad_10m;
// slope noise
float slopenoise_50m = slopeLines2D(rawPos, grad_dir, 50.0, steepness);
float slopenoise_100m = slopeLines2D(rawPos, grad_dir, 100.0, steepness);
float slopenoise_50m = SlopeLines2D(rawPos, grad_dir, 50.0, steepness);
float slopenoise_100m = SlopeLines2D(rawPos, grad_dir, 100.0, steepness);
float snownoise_25m = mix(noise_25m, slopenoise_50m, clamp(3.0*(1.0-steepness),0.0,1.0));
float snownoise_50m = mix(noise_50m, slopenoise_100m, clamp(3.0*(1.0-steepness),0.0,1.0));
@ -349,6 +350,21 @@ float mix_factor;
local_autumn_factor = texel.a;
}
// strata noise
float stratnoise_50m;
float stratnoise_10m;
if (rock_strata==1)
{
stratnoise_50m = Strata3D(vec3 (rawPos.x, rawPos.y, msl_altitude), 50.0, 0.2);
stratnoise_10m = Strata3D(vec3 (rawPos.x, rawPos.y, msl_altitude), 10.0, 0.2);
stratnoise_50m = mix(stratnoise_50m, 1.0, smoothstep(0.8,0.9, steepness));
stratnoise_10m = mix(stratnoise_10m, 1.0, smoothstep(0.8,0.9, steepness));
texel *= (0.4 + 0.4 * stratnoise_50m + 0.2 * stratnoise_10m);
}
// the dot vegetation texture overlay
texel.rgb = mix(texel.rgb, dot_texel.rgb, dot_texel.a * (dotnoise_10m + dotnoise_15m) * detail_fade(1.0 * (dot_size * (1.0 +0.1*dot_size)), view_angle,dist));