diff --git a/Effects/surface-lights-directional.eff b/Effects/surface-lights-directional.eff new file mode 100644 index 000000000..b9934fcd3 --- /dev/null +++ b/Effects/surface-lights-directional.eff @@ -0,0 +1,286 @@ +<?xml version="1.0" encoding="utf-8"?> +<PropertyList> + <name>Effects/surface-lights-directional</name> + <parameters> + <!-- min-size, max-size, size, attenuation, cull-face parameters filled in by C++ code --> + <texture n="0"> + <type>light-sprite</type> + <wrap-s>clamp</wrap-s> + <wrap-t>clamp</wrap-t> + </texture> + <visibility><use>/environment/ground-visibility-m</use></visibility> + <avisibility><use>/environment/visibility-m</use></avisibility> + <lthickness><use>/environment/ground-haze-thickness-m</use></lthickness> + <eye_alt><use>/sim/rendering/eye-altitude-m</use></eye_alt> + <terminator><use>/environment/terminator-relative-position-m</use></terminator> + </parameters> + + <technique n="10"> + <!-- ALS --> + <predicate> + <and> + <property>/sim/rendering/point-sprites</property> + <property>/sim/rendering/shaders/skydome</property> + <or> + <less-equal> + <value type="float">2.0</value> + <glversion/> + </less-equal> + <and> + <extension-supported>GL_ARB_point_sprite</extension-supported> + <extension-supported>GL_ARB_point_parameters</extension-supported> + <extension-supported>GL_ARB_shader_objects</extension-supported> + <extension-supported>GL_ARB_shading_language_100</extension-supported> + <extension-supported>GL_ARB_vertex_shader</extension-supported> + <extension-supported>GL_ARB_fragment_shader</extension-supported> + </and> + </or> + </and> + </predicate> + <pass> + <render-bin> + <bin-number>8</bin-number> + <bin-name>DepthSortedBin</bin-name> + </render-bin> + <lighting>false</lighting> + <blend> + <source>src-alpha</source> + <destination>one-minus-src-alpha</destination> + </blend> + <depth> + <write-mask>false</write-mask> + </depth> + <!--<alpha-test> + <comparison>gequal</comparison> + <reference type="float">0.03</reference> + </alpha-test>--> + <cull-face>back</cull-face> + <polygon-mode> + <front>point</front> + </polygon-mode> + <point> + <min-size><use>min-size</use></min-size> + <max-size><use>max-size</use></max-size> + <size><use>size</use></size> + <attenuation><use>attenuation</use></attenuation> + </point> + <texture-unit> + <unit>0</unit> + <point-sprite>true</point-sprite> + <type><use>texture[0]/type</use></type> + <wrap-s><use>texture[0]/wrap-s</use></wrap-s> + <wrap-t><use>texture[0]/wrap-t</use></wrap-t> + </texture-unit> + <program> + <vertex-shader>Shaders/surface-light-ALS.vert</vertex-shader> + <fragment-shader>Shaders/surface-light-ALS.frag</fragment-shader> + <fragment-shader>Shaders/noise.frag</fragment-shader> + </program> + <uniform> + <name>size</name> + <type>float</type> + <value><use>size</use></value> + </uniform> + <uniform> + <name>visibility</name> + <type>float</type> + <value><use>visibility</use></value> + </uniform> + <uniform> + <name>avisibility</name> + <type>float</type> + <value><use>avisibility</use></value> + </uniform> + <uniform> + <name>hazeLayerAltitude</name> + <type>float</type> + <value><use>lthickness</use></value> + </uniform> + <uniform> + <name>eye_alt</name> + <type>float</type> + <value><use>eye_alt</use></value> + </uniform> + <uniform> + <name>max_size</name> + <type>float</type> + <value><use>max-size</use></value> + </uniform> + <uniform> + <name>is_directional</name> + <type>bool</type> + <value><use>light-directional</use></value> + </uniform> + <uniform> + <name>texture</name> + <type>sampler-2d</type> + <value type="int">0</value> + </uniform> + <uniform> + <name>terminator</name> + <type>float</type> + <value><use>terminator</use></value> + </uniform> + <vertex-program-point-size>true</vertex-program-point-size> + </pass> + </technique> + + + + + <technique n="17"> + <!-- Combined technique --> + <predicate> + <and> + <property>/sim/rendering/point-sprites</property> + <or> + <less-equal> + <value type="float">2.0</value> + <glversion/> + </less-equal> + <and> + <extension-supported>GL_ARB_point_sprite</extension-supported> + <extension-supported>GL_ARB_point_parameters</extension-supported> + </and> + </or> + </and> + </predicate> + <pass> + <render-bin> + <bin-number>8</bin-number> + <bin-name>DepthSortedBin</bin-name> + </render-bin> + <lighting>false</lighting> + <depth> + <write-mask>false</write-mask> + </depth> + <blend> + <source>src-alpha</source> + <destination>one-minus-src-alpha</destination> + </blend> + <alpha-test> + <comparison>gequal</comparison> + <reference type="float">0.1</reference> + </alpha-test> + <cull-face>back</cull-face> + <polygon-mode> + <front>point</front> + </polygon-mode> + <point> + <min-size><use>min-size</use></min-size> + <max-size><use>max-size</use></max-size> + <size><use>size</use></size> + <attenuation><use>attenuation</use></attenuation> + </point> + <texture-unit> + <unit>0</unit> + <point-sprite>true</point-sprite> + <type><use>texture[0]/type</use></type> + <wrap-s><use>texture[0]/wrap-s</use></wrap-s> + <wrap-t><use>texture[0]/wrap-t</use></wrap-t> + </texture-unit> + </pass> + </technique> + + <technique n="18"> + <!-- Sprite technique --> + <predicate> + <and> + <property>/sim/rendering/point-sprites</property> + <or> + <less-equal> + <value type="float">2.0</value> + <glversion/> + </less-equal> + <extension-supported>GL_ARB_point_sprite</extension-supported> + </or> + </and> + </predicate> + <pass> + <render-bin> + <bin-number>8</bin-number> + <bin-name>DepthSortedBin</bin-name> + </render-bin> + <lighting>false</lighting> + <depth> + <write-mask>false</write-mask> + </depth> + <blend> + <source>src-alpha</source> + <destination>one-minus-src-alpha</destination> + </blend> + <cull-face>back</cull-face> + <polygon-mode> + <front>point</front> + </polygon-mode> + <texture-unit> + <unit>0</unit> + <point-sprite>true</point-sprite> + <type><use>texture[0]/type</use></type> + <wrap-s><use>texture[0]/wrap-s</use></wrap-s> + <wrap-t><use>texture[0]/wrap-t</use></wrap-t> + </texture-unit> + </pass> + </technique> + + <technique n="19"> + <!-- Attenuation technique --> + <predicate> + <and> + <or> + <less-equal> + <value type="float">2.0</value> + <glversion/> + </less-equal> + <extension-supported>GL_ARB_point_parameters</extension-supported> + </or> + </and> + </predicate> + <pass> + <point> + <min-size><use>min-size</use></min-size> + <max-size><use>max-size</use></max-size> + <size><use>size</use></size> + <attenuation><use>attenuation</use></attenuation> + </point> + <render-bin> + <bin-number>8</bin-number> + <bin-name>DepthSortedBin</bin-name> + </render-bin> + <depth> + <write-mask>false</write-mask> + </depth> + <blend> + <source>src-alpha</source> + <destination>one-minus-src-alpha</destination> + </blend> + <lighting>false</lighting> + <cull-face>back</cull-face> + <polygon-mode> + <front>point</front> + </polygon-mode> + </pass> + </technique> + + <technique n="20"> + <!-- Basic technique --> + <pass> + <render-bin> + <bin-number>8</bin-number> + <bin-name>DepthSortedBin</bin-name> + </render-bin> + <lighting>false</lighting> + <depth> + <write-mask>false</write-mask> + </depth> + <blend> + <source>src-alpha</source> + <destination>one-minus-src-alpha</destination> + </blend> + <cull-face>back</cull-face> + <polygon-mode> + <front>point</front> + </polygon-mode> + </pass> + </technique> +</PropertyList> diff --git a/Effects/surface-lights.eff b/Effects/surface-lights.eff index ea17f3b5c..1f3d9bc14 100644 --- a/Effects/surface-lights.eff +++ b/Effects/surface-lights.eff @@ -54,7 +54,7 @@ <comparison>gequal</comparison> <reference type="float">0.03</reference> </alpha-test>--> - <cull-face><use>directional</use></cull-face> + <cull-face><use>cull-face</use></cull-face> <polygon-mode> <front>point</front> <back>point</back> @@ -125,7 +125,7 @@ <vertex-program-point-size>true</vertex-program-point-size> </pass> </technique> - + @@ -163,10 +163,9 @@ <comparison>gequal</comparison> <reference type="float">0.1</reference> </alpha-test> - <cull-face><use>directional</use></cull-face> + <cull-face>back</cull-face> <polygon-mode> <front>point</front> - <back>point</back> </polygon-mode> <point> <min-size><use>min-size</use></min-size> @@ -211,10 +210,9 @@ <source>src-alpha</source> <destination>one-minus-src-alpha</destination> </blend> - <cull-face><use>directional</use></cull-face> + <cull-face><use>cull-face</use></cull-face> <polygon-mode> <front>point</front> - <back>point</back> </polygon-mode> <texture-unit> <unit>0</unit> @@ -258,7 +256,7 @@ <destination>one-minus-src-alpha</destination> </blend> <lighting>false</lighting> - <cull-face><use>directional</use></cull-face> + <cull-face><use>cull-face</use></cull-face> <polygon-mode> <front>point</front> <back>point</back> @@ -281,10 +279,9 @@ <source>src-alpha</source> <destination>one-minus-src-alpha</destination> </blend> - <cull-face><use>directional</use></cull-face> + <cull-face><use>cull-face</use></cull-face> <polygon-mode> <front>point</front> - <back>point</back> </polygon-mode> </pass> </technique> diff --git a/Shaders/surface-light-ALS.frag b/Shaders/surface-light-ALS.frag index 4dbda9abf..86da7e301 100644 --- a/Shaders/surface-light-ALS.frag +++ b/Shaders/surface-light-ALS.frag @@ -35,9 +35,9 @@ if (alt < 30000.0) 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)); + return fade_mix * exp(-targ*targ - pow(targ,4.0)) + (1.0 - fade_mix) * exp(-targ - pow(targ,4.0)); } -else +else { return exp(- targ * targ - pow(targ,4.0)); } @@ -56,13 +56,13 @@ float r = length(coord); if (pixelSize<1.3) {return vec4 (1.0,1.0,1.0,1.0) * 0.08;} float angle = noise * 6.2832; - + float sinphi = dot(vec2 (sin(angle),cos(angle)), normalize(coord)); float sinterm = sin(mod((sinphi-3.0) * (sinphi-3.0),6.2832)); float ray = 0.0; if (sinterm == 0.0) - {ray = 0.0;} -else + {ray = 0.0;} +else {ray = clamp(pow(sinterm,10.0),0.0,1.0);} float fogEffect = (1.0-smoothstep(0.4,0.8,transmission)); @@ -76,7 +76,7 @@ return vec4 (1.0,1.0,1.0,1.0) * intensity; void main() { - + float dist = length(relPos); float delta_z = hazeLayerAltitude - eye_alt; float transmission; @@ -86,7 +86,10 @@ void main() float distance_in_layer; float transmission_arg; - float noise = Noise2D(rawPos.xy ,1.0); + // Discard the second and third vertex, which are used for directional lighting + if (gl_Color.a == 0.0) {discard;} + + float noise = Noise2D(rawPos.xy ,1.0); // angle with horizon float ct = dot(vec3(0.0, 0.0, 1.0), relPos)/dist; @@ -96,7 +99,7 @@ void main() if (delta_z > 0.0) // we're inside the layer { - if (ct < 0.0) // we look down + if (ct < 0.0) // we look down { distance_in_layer = dist; vAltitude = min(distance_in_layer,min(visibility, avisibility)) * ct; @@ -108,26 +111,26 @@ void main() 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; + 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; + 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 @@ -138,7 +141,7 @@ void main() { transmission_arg = transmission_arg + (distance_in_layer/visibility); } - else + else { transmission_arg = transmission_arg + (distance_in_layer/avisibility); } @@ -153,7 +156,7 @@ void main() //vec4 texel = texture2D(texture,gl_TexCoord[0].st); vec4 texel = light_sprite(gl_TexCoord[0].st,transmission, noise); - gl_FragColor = vec4 (clamp(gl_Color.rgb,0.0,1.0), texel.a * transmission * dist_att); - + gl_FragColor = vec4 (clamp(gl_Color.rgb,0.0,1.0), texel.a * transmission * dist_att); + }