1
0
Fork 0

Earthview 2.1 - parallax mapping for cloud layer, lightning at night, Rayleigh scattering in atmosphere and minor bugfixes

This commit is contained in:
Thorsten Renk 2017-04-05 16:50:31 +03:00
parent 3d409359af
commit 48768ee9d2
16 changed files with 2257 additions and 1963 deletions

View file

@ -26,6 +26,7 @@
<use_IR_vision><use>/sim/rendering/als-filters/use-IR-vision</use></use_IR_vision>
<display_xsize><use>/sim/startup/xsize</use></display_xsize>
<display_ysize><use>/sim/startup/ysize</use></display_ysize>
<arc_id>0.0</arc_id>
</parameters>
@ -77,9 +78,9 @@
<shade-model>
<use>shade-model</use>
</shade-model>
<cull-face>
<!--<cull-face>
<use>cull-face</use>
</cull-face>
</cull-face>-->
<rendering-hint>
<use>rendering-hint</use>
</rendering-hint>
@ -87,7 +88,7 @@
<write-mask>false</write-mask>
</depth>
<render-bin>
<bin-number>10</bin-number>
<bin-number>111</bin-number>
<bin-name>DepthSortedBin</bin-name>
</render-bin>
<texture-unit>
@ -164,6 +165,11 @@
<type>float</type>
<value><use>brightness</use></value>
</uniform>
<uniform>
<name>arc_id</name>
<type>float</type>
<value><use>arc_id</use></value>
</uniform>
<uniform>
<name>use_filtering</name>
<type>bool</type>

View file

@ -24,6 +24,9 @@
<shade-effect><use>/earthview/shade-effect</use></shade-effect>
<sun-angle><use>/sim/time/sun-angle-rad</use></sun-angle>
<air_pollution><use>/environment/air-pollution-norm</use></air_pollution>
<roi_x1><use>/earthview/roi-x1</use></roi_x1>
<roi_y1><use>/earthview/roi-y1</use></roi_y1>
<lightning><use>/earthview/lightning</use></lightning>
<use_filtering><use>/sim/rendering/als-filters/use-filtering</use></use_filtering>
<gamma><use>/sim/rendering/als-filters/gamma</use></gamma>
<brightness><use>/sim/rendering/als-filters/brightness</use></brightness>
@ -34,6 +37,7 @@
<use_IR_vision><use>/sim/rendering/als-filters/use-IR-vision</use></use_IR_vision>
<display_xsize><use>/sim/startup/xsize</use></display_xsize>
<display_ysize><use>/sim/startup/ysize</use></display_ysize>
</parameters>
<generate>
<normal type="int">15</normal>
@ -195,6 +199,27 @@
<use>sun-angle</use>
</value>
</uniform>
<uniform>
<name>lightning</name>
<type>float</type>
<value>
<use>lightning</use>
</value>
</uniform>
<uniform>
<name>roi_x1</name>
<type>float</type>
<value>
<use>roi_x1</use>
</value>
</uniform>
<uniform>
<name>roi_y1</name>
<type>float</type>
<value>
<use>roi_y1</use>
</value>
</uniform>
<uniform>
<name>gamma</name>
<type>float</type>

View file

@ -35,6 +35,7 @@
<!-- DIFFUSE -->
</material>
<visibility><use>/environment/visibility-m</use></visibility>
<air_pollution><use>/environment/air-pollution-norm</use></air_pollution>
<use-clouds><use>/earthview/cloudsphere-flag</use></use-clouds>
<use-cloud-shadows><use>/earthview/cloud-shadow-flag</use></use-cloud-shadows>
<use-overlay-textures><use>/earthview/overlay-texture-flag</use></use-overlay-textures>
@ -196,6 +197,13 @@
<use>visibility</use>
</value>
</uniform>
<uniform>
<name>air_pollution</name>
<type>float</type>
<value>
<use>air_pollution</use>
</value>
</uniform>
<uniform>
<name>sun_angle</name>
<type>float</type>
@ -412,6 +420,13 @@
<use>visibility</use>
</value>
</uniform>
<uniform>
<name>air_pollution</name>
<type>float</type>
<value>
<use>air_pollution</use>
</value>
</uniform>
<uniform>
<name>sun_angle</name>
<type>float</type>

View file

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<PropertyList>
<name>aurora_inner</name>
<inherits-from>Effects/planet-aurora</inherits-from>
<parameters>
<arc_id>1.0</arc_id>
</parameters>
</PropertyList>

View file

@ -1,49 +1,11 @@
<?xml version="1.0"?>
<PropertyList>
<path>aurora_projection.ac</path>
<animation>
<type>scale</type>
<x-offset>58030</x-offset>
<y-offset>58030</y-offset>
<z-offset>58030</z-offset>
</animation>
<animation>
<enable-hot type="bool">false</enable-hot>
</animation>
<animation>
<type>rotate</type>
<property>/earthview/yaw-deg</property>
<factor>1</factor>
<offset-deg>0</offset-deg>
<center>
<x-m>0</x-m>
<y-m>0</y-m>
<z-m>0</z-m>
</center>
<axis>
<x>0</x>
<y>0</y>
<z>1</z>
</axis>
</animation>
<effect>
<inherits-from>Effects/planet-aurora</inherits-from>
<object-name>aurora</object-name>
</effect>
<model>
<path>aurora_inner.xml</path>
</model>
<model>
<path>aurora_outer.xml</path>
</model>
</PropertyList>

43
Models/Astro/aurora_inner.xml Executable file
View file

@ -0,0 +1,43 @@
<?xml version="1.0"?>
<PropertyList>
<path>aurora_projection.ac</path>
<animation>
<type>scale</type>
<x-offset>51030</x-offset>
<y-offset>51030</y-offset>
<z-offset>58030</z-offset>
</animation>
<animation>
<enable-hot type="bool">false</enable-hot>
</animation>
<animation>
<type>rotate</type>
<property>/earthview/yaw-deg</property>
<factor>1</factor>
<offset-deg>0</offset-deg>
<center>
<x-m>0</x-m>
<y-m>0</y-m>
<z-m>0</z-m>
</center>
<axis>
<x>0</x>
<y>0</y>
<z>1</z>
</axis>
</animation>
<effect>
<inherits-from>Models/Astro/Effects/aurora_inner</inherits-from>
<object-name>aurora</object-name>
</effect>
</PropertyList>

49
Models/Astro/aurora_outer.xml Executable file
View file

@ -0,0 +1,49 @@
<?xml version="1.0"?>
<PropertyList>
<path>aurora_projection.ac</path>
<animation>
<type>scale</type>
<x-offset>58030</x-offset>
<y-offset>58030</y-offset>
<z-offset>58030</z-offset>
</animation>
<animation>
<enable-hot type="bool">false</enable-hot>
</animation>
<animation>
<type>rotate</type>
<property>/earthview/yaw-deg</property>
<factor>1</factor>
<offset-deg>0</offset-deg>
<center>
<x-m>0</x-m>
<y-m>0</y-m>
<z-m>0</z-m>
</center>
<axis>
<x>0</x>
<y>0</y>
<z>1</z>
</axis>
</animation>
<effect>
<inherits-from>Effects/planet-aurora</inherits-from>
<object-name>aurora</object-name>
</effect>
</PropertyList>

View file

@ -2,6 +2,39 @@
# Earthview orbital rendering
###########################################################
var lightning_table = [];
var entry = [2.85, 30.28, 0.35, 0.045];
append(lightning_table, entry);
entry = [9.3,8.0,0.1, 0.105];
append(lightning_table, entry);
entry = [6.0, -72.0, 0.2, 0.09];
append(lightning_table, entry);
entry = [30.89, -112.0, 0.72, 0.34];
append(lightning_table, entry);
var check_lightning_table = func (lat, lon) {
for (var i=0; i< size(lightning_table); i=i+1)
{
if (math.abs(lat - lightning_table[i][0]) < 15.0)
{
if (math.abs(lon - lightning_table[i][1]) < 15.0)
{
return i;
}
}
}
return -1;
}
var start = func() {
if (earthview_running_flag ==1) {return;}
@ -75,7 +108,7 @@ setprop("/environment/visibility-m", 80000.0);
setprop("/sim/rendering/mie", 0.0);
setprop("/sim/rendering/rayleigh", 0.00002);
setprop("/sim/rendering/dome-density", 1.0);
setprop("/earthview/shade-effect", 1.5);
setprop("/earthview/shade-effect", 0.5);
earth_model.l1 = setlistener("/earthview/show-n1", func(n) {load_sector (1, n);},0,0);
earth_model.l2 = setlistener("/earthview/show-n2", func(n) {load_sector (2, n);},0,0);
@ -89,6 +122,8 @@ earth_model.l8 = setlistener("/earthview/show-s4", func(n) {load_sector (8, n);}
control_loop();
slow_loop();
}
var stop = func () {
@ -289,6 +324,71 @@ if (getprop("/earthview/control_loop_flag") ==1) {settimer( func {control_loop()
}
var slow_loop = func {
if (earthview_running_flag == 0) {return;}
# thunderstorms
var lat = getprop("/position/latitude-deg");
var lon = getprop("/position/longitude-deg") + getprop("/earthview/cloudsphere-angle");
var index = check_lightning_table(lat, lon);
if (index > -1)
{
rn = rand();
if (rn < 0.3)
{
var roi_x_base = lightning_table[index][2];
var roi_y_base = lightning_table[index][3];
var rn = 0.005 * (2.0 * rand() - 0.5);
setprop("/earthview/roi-x1", roi_x_base + rn);
rn = 0.005 * (2.0 * rand() - 0.5);
setprop("/earthview/roi-y1", roi_y_base + rn);
lightning_strike();
}
}
if (getprop("/earthview/control_loop_flag") ==1) {settimer( func {slow_loop(); },1.0);}
}
var lightning_strike = func {
var rn = rand();
var repeat = 1;
if (rn > 0.5) {repeat = 2;}
var duration = 0.1 + 0.1 * rand();
var strength = 0.5 + 1.0 * rand();
setprop("/earthview/lightning", strength);
settimer( func{ setprop("/earthview/lightning", 0.0);}, duration);
var duration1 = 0.1 + 0.1 * rand();
if (repeat == 2)
{
settimer( func{ setprop("/earthview/lightning", strength);}, duration + 0.1);
settimer( func{ setprop("/earthview/lightning", 0.0);}, duration + 0.1 + duration1);
}
}
# rotate position of cloud tiles
var adjust_cloud_tiles = func {

View file

@ -14,6 +14,7 @@ uniform float upper_alt_factor;
uniform float penetration_factor;
uniform float patchiness;
uniform float afterglow;
uniform float arc_id;
uniform float osg_SimulationTime;
float Noise2D(in vec2 coord, in float wavelength);
@ -23,11 +24,12 @@ void main()
{
float vCoord = abs(vertex.z);
float vCoord = abs(vertex.z) - 0.02 * arc_id;
float aurora_time = 0.001 * osg_SimulationTime;
float aurora_time = 0.001 * osg_SimulationTime + arc_id;
float noise_01 = Noise2D( vec2(vertex.x +aurora_time, vertex.y), 0.05);
float blend_factor = smoothstep(0.935, 0.955, vCoord - 0.001 * noise_01 - 0.02 * (1.0-upper_alt_factor));

View file

@ -4,6 +4,10 @@ varying vec3 vertex;
varying vec3 normal;
varying vec3 relVec;
uniform float osg_SimulationTime;
uniform float arc_id;
void main()
{
@ -11,5 +15,14 @@ void main()
vertex = gl_Vertex.xyz;
vec3 ep = (gl_ModelViewMatrixInverse * vec4 (0.0, 0.0, 0.0, 1.0)).xyz;
relVec = vertex - ep;
gl_Position = ftransform();
vec4 vert_out = gl_Vertex;
float ang = dot(vert_out.xy, vec2 (0.0, 1.0));
vert_out.x *= (1.0 + 0.05 * sin(ang + 0.1 * osg_SimulationTime + arc_id));
vert_out.y *= (1.0 + 0.05 * sin(ang + 0.12 * osg_SimulationTime + arc_id));
gl_Position = gl_ModelViewProjectionMatrix * vert_out;
}

View file

@ -12,6 +12,10 @@ uniform float shade_effect;
uniform float sun_angle;
uniform float air_pollution;
uniform float roi_x1;
uniform float roi_y1;
uniform float lightning;
uniform bool use_overlay;
uniform bool use_cloud_normals;
@ -32,6 +36,17 @@ return cos1 * cos2 + sign * sin1 * sin2;
}
vec3 lightning_color (in vec2 coord)
{
vec2 roi1 = vec2 (roi_x1, roi_y1);
float strength = 1.0 - smoothstep(0.0, 0.005, length(roi1 - coord));
return strength * vec3 (0.43, 0.57, 1.0);
}
void main()
{
@ -71,6 +86,9 @@ void main()
vec3 binormal = cross(n, tangent);
float NdotL2 = 0.0;
texel = texture2D(texture, gl_TexCoord[0].st);
ref_texel = texel;
if (use_cloud_normals)
{
vec2 sun2d = vec2 (0.0, 1.0);
@ -82,7 +100,18 @@ void main()
vec4 comp_texel = texture2D(texture, gl_TexCoord[0].st - 0.0005 * grad_dir);
float slope = shade_effect * (comp_texel.a - ref_texel.a);
// parallax mapping
xOffset = -1.0 * dot(ecViewDir, tangent);
yOffset = -1.0 * dot(ecViewDir, binormal);
grad_dir = normalize (vec2 (xOffset, yOffset));
texel = texture2D(texture, gl_TexCoord[0].st - 0.0005 * grad_dir * ref_texel.a * 0.7);
// relief shading based on gradient and parallax lookup
float slope = shade_effect * (comp_texel.a - ref_texel.a) * texel.a;
float sign = -1.0;
if (slope < 0.0) {sign = 1.0;}
@ -90,8 +119,13 @@ void main()
NdotL2 = dot (snormal, sun2d);
NdotL = add_cosines(NdotL, NdotL2, sign );
}
color += diff_term * max(NdotL, 0.15) ;
@ -101,15 +135,13 @@ void main()
color.rgb *= smoothstep(-0.2, -0.1, NdotLraw);
//
float darkness_fact = 1.0 - smoothstep(0.0,0.2, length(color.rgb));
color.rgb += lightning_color(gl_TexCoord[0].st) * (1.0 - texel.a) * lightning * darkness_fact;
color.a = diffuse_term.a;
color.a = 1.0;//diffuse_term.a;
color = clamp(color, 0.0, 1.0);
texel = texture2D(texture, gl_TexCoord[0].st);
ref_texel = texel;
structureTexel = texture2D(structure_texture, 20.0 * gl_TexCoord[0].st);
float noise = Noise2D( gl_TexCoord[0].st, 0.01);
@ -129,6 +161,9 @@ void main()
}
texel.a = clamp((1.0 + darkness_fact) * texel.a, 0.0, 1.0);
fragColor = color * texel;
fragColor.rgb = filter_combined(fragColor.rgb);

View file

@ -9,6 +9,7 @@ varying vec3 ecViewDir;
varying vec3 VTangent;
uniform float visibility;
uniform float air_pollution;
uniform float sun_angle;
uniform bool use_clouds;
uniform bool use_cloud_shadows;
@ -116,7 +117,6 @@ void main()
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.
@ -141,18 +141,15 @@ void main()
float distance_through_atmosphere = min(10.0 / (abs(angle)+0.001),500.0);
float correction = smoothstep(-0.4, 0.0, dot(n, lightDir) - 0.45 ) ;
//correction = correction + (1.0 - correction) * (1.0 - smoothstep(1.40, 1.57, sun_angle));
float correction1 = 1.0 - smoothstep(1.4, 1.45, sun_angle);
correction1 = 1.0;
float fogLighting = clamp(NdotLfog,0.0,1.0) * length(diff_term.rgb/1.73);
//vec4 fogColor = vec4 (0.83,0.9,1.0,1.0) * clamp(length(diffuse_term.rgb/1.73 * correction * clamp(NdotL + correction1,0.01, 0.99) ),0.0,1.0);
vec4 fogColor = vec4 (0.83,0.9,1.0,1.0) * clamp(smoothstep(0.4, 1.0,NdotLfog),0.0,1.0) * length(diff_term.rgb/1.73);
vec4 fogColor = vec4 (0.83,0.9,1.0,1.0) * fogLighting;
vec3 rayleighColor = vec3 (0.17, 0.52, 0.87) * fogLighting;
float fogFactor = exp(-distance_through_atmosphere/(visibility/1000.0));
float rayleighFactor = exp(-distance_through_atmosphere/(300.0 / (1.0 + 4.0 * air_pollution)) );
fragColor.rgb = mix(rayleighColor, fragColor.rgb, rayleighFactor);
fragColor = mix(fogColor, fragColor, fogFactor);
fragColor.rgb = filter_combined(fragColor.rgb);

View file

@ -9,6 +9,7 @@ varying vec3 ecViewDir;
varying vec3 VTangent;
uniform float visibility;
uniform float air_pollution;
uniform float sun_angle;
uniform bool use_clouds;
uniform bool use_cloud_shadows;
@ -130,19 +131,17 @@ void main()
float angle = dot(normalize(ecViewDir), normalize(normal));
float distance_through_atmosphere = min(10.0 / (abs(angle)+0.001),500.0);
float fogLighting = clamp(NdotL,0.0,1.0) * length(diff_term.rgb/1.73);
float correction = smoothstep(-0.4, 0.0, dot(n, lightDir) - 0.45 ) ;
//correction = correction + (1.0 - correction) * (1.0 - smoothstep(1.40, 1.57, sun_angle));
float correction1 = 1.0 - smoothstep(1.4, 1.45, sun_angle);
correction1 = 1.0;
//vec4 fogColor = vec4 (0.83,0.9,1.0,1.0) * clamp(length(diffuse_term.rgb/1.73 * correction * clamp(NdotL + correction1,0.01, 0.99) ),0.0,1.0);
vec4 fogColor = vec4 (0.83,0.9,1.0,1.0) * fogLighting;
vec3 rayleighColor = vec3 (0.17, 0.52, 0.87) * fogLighting;
vec4 fogColor = vec4 (0.83,0.9,1.0,1.0) * clamp(smoothstep(0.4, 1.0,NdotL),0.0,1.0) * length(diff_term.rgb/1.73);
float fogFactor = exp(-distance_through_atmosphere/(visibility/1000.0));
float rayleighFactor = exp(-distance_through_atmosphere/(300.0 / (1.0 + 4.0 * air_pollution)) );
fragColor.rgb = mix(rayleighColor, fragColor.rgb, rayleighFactor);
fragColor = mix(fogColor, fragColor, fogFactor);
fragColor.rgb = filter_combined(fragColor.rgb);

View file

@ -1369,6 +1369,9 @@ Started September 2000 by David Megginson, david@megginson.com
<show-dummy type="bool" userarchive="n">false</show-dummy>
<normal-flag type="bool" userarchive="y">false</normal-flag>
<cloud-normal-flag type="bool" userarchive="y">false</cloud-normal-flag>
<roi-x1 type="float" userarchive="n">0.0</roi-x1>
<roi-y1 type="float" userarchive="n">0.0</roi-y1>
<lightning type="float" userarchive="n">0.0</lightning>
</earthview>
</PropertyList>
<!-- end of preferences.xml -->

View file

@ -396,6 +396,42 @@
<property>/environment/visibility-m</property>
</text>
<text>
<label> </label>
</text>
</group>
<group>
<layout>hbox</layout>
<halign>right</halign>
<!-- gap -->
<text>
<label> </label>
</text>
<text>
<label>Relative dust density</label>
</text>
<slider>
<name>air_pollution</name>
<min>0.0</min>
<max>1.0</max>
<property>/environment/air-pollution-norm</property>
<binding>
<command>dialog-apply</command>
<object-name>air_pollution</object-name>
</binding>
<live>true</live>
</slider>
<text>
<label>12345678</label>
<format>%.1f</format>
<live>true</live>
<property>/environment/air-pollution-norm</property>
</text>
<!-- gap -->
<text>
<label> </label>