From 94c96a29c70cf32f697c973055ad4a0440896f97 Mon Sep 17 00:00:00 2001 From: Thorsten Renk Date: Sat, 30 Apr 2016 21:27:28 +0300 Subject: [PATCH] ALS bird shader --- Effects/birdswarm.eff | 166 ++++++++++++++++++ Models/Effects/Birds/birds.ac | 22 +++ Models/Effects/Birds/birds_in_flight.png | Bin 0 -> 35182 bytes Models/Effects/Birds/birdswarm.ac | 22 +++ Models/Effects/Birds/birdswarm.xml | 22 +++ Models/Effects/Birds/birdswarm1.xml | 25 +++ Models/Effects/Birds/birdswarm2.xml | 28 +++ Models/Effects/Birds/birdswarm3.xml | 25 +++ Models/Effects/Birds/birdswarm4.xml | 25 +++ Shaders/birds-ALS.frag | 206 +++++++++++++++++++++++ Shaders/birds-ALS.vert | 48 ++++++ 11 files changed, 589 insertions(+) create mode 100644 Effects/birdswarm.eff create mode 100644 Models/Effects/Birds/birds.ac create mode 100644 Models/Effects/Birds/birds_in_flight.png create mode 100644 Models/Effects/Birds/birdswarm.ac create mode 100644 Models/Effects/Birds/birdswarm.xml create mode 100644 Models/Effects/Birds/birdswarm1.xml create mode 100644 Models/Effects/Birds/birdswarm2.xml create mode 100644 Models/Effects/Birds/birdswarm3.xml create mode 100644 Models/Effects/Birds/birdswarm4.xml create mode 100644 Shaders/birds-ALS.frag create mode 100644 Shaders/birds-ALS.vert diff --git a/Effects/birdswarm.eff b/Effects/birdswarm.eff new file mode 100644 index 000000000..21d329039 --- /dev/null +++ b/Effects/birdswarm.eff @@ -0,0 +1,166 @@ + + + + Effects/birdswarm + + + + Models/Effects/birds_in_flight.png + 2d + linear-mipmap-linear + repeat + repeat + normalized + + + 0.9 + 0.8 + 0.82 + 0.7 + 0.3 + 0.25 + /environment/ground-visibility-m + /environment/visibility-m + /environment/ground-haze-thickness-m + /environment/mean-terrain-elevation-m + /sim/rendering/eye-altitude-m + /environment/terminator-relative-position-m + /rendering/scene/scattering + + + + + + /sim/rendering/shaders/skydome + + + 2.0 + + + + GL_ARB_shader_objects + GL_ARB_shading_language_100 + GL_ARB_vertex_shader + GL_ARB_fragment_shader + + + + + + true + + material/active + material/ambient + material/diffuse + material/specular + material/emissive + material/shininess + material/color-mode + + + blend/active + blend/source + blend/destination + + shade-model + cull-face + rendering-hint + + 111 + DepthSortedBin + + + 0 + texture[0]/image + texture[0]/type + texture[0]/filter + texture[0]/wrap-s + texture[0]/wrap-t + texture[0]/internal-format + + + false + + false + + Shaders/birds-ALS.vert + Shaders/birds-ALS.frag + Shaders/noise.frag + Shaders/hazes.frag + + + + + color_base_r + float + color_base_r + + + color_base_g + float + color_base_g + + + color_base_b + float + color_base_b + + + color_alt_r + float + color_alt_r + + + color_alt_g + float + color_alt_g + + + color_alt_b + float + color_alt_b + + + visibility + float + visibility + + + avisibility + float + avisibility + + + hazeLayerAltitude + float + lthickness + + + scattering + float + scattering + + + eye_alt + float + eye_alt + + + terminator + float + terminator + + + texture + sampler-2d + 0 + + + texture + sampler-2d + 0 + + + + + diff --git a/Models/Effects/Birds/birds.ac b/Models/Effects/Birds/birds.ac new file mode 100644 index 000000000..566004b12 --- /dev/null +++ b/Models/Effects/Birds/birds.ac @@ -0,0 +1,22 @@ +AC3Db +MATERIAL "DefaultWhite" rgb 1.0000 1.0000 1.0000 amb 0.2000 0.2000 0.2000 emis 0.0000 0.0000 0.0000 spec 0.5000 0.5000 0.5000 shi 10 trans 0.0000 +MATERIAL "DefaultWhite" rgb 1.0000 1.0000 1.0000 amb 0.2000 0.2000 0.2000 emis 0.0000 0.0000 0.0000 spec 0.0250 0.0250 0.0250 shi 50 trans 0.1000 +OBJECT world +name "Blender_export__birds1.ac" +kids 1 +OBJECT poly +name "birds1" +numvert 4 +-0.0000019 -1.0000000 -1.0000000 +-0.0000005 1.0000000 -1.0000000 +0.0000005 -1.0000000 1.0000000 +0.0000019 1.0000000 1.0000000 +numsurf 1 +SURF 0X20 +mat 1 +refs 4 +1 0 0 +0 0 0 +2 0 0 +3 0 0 +kids 0 diff --git a/Models/Effects/Birds/birds_in_flight.png b/Models/Effects/Birds/birds_in_flight.png new file mode 100644 index 0000000000000000000000000000000000000000..aaa96c6911a4b28cd60cd3716607eba1b428b196 GIT binary patch literal 35182 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 literal 0 HcmV?d00001 diff --git a/Models/Effects/Birds/birdswarm.ac b/Models/Effects/Birds/birdswarm.ac new file mode 100644 index 000000000..f3c6798e8 --- /dev/null +++ b/Models/Effects/Birds/birdswarm.ac @@ -0,0 +1,22 @@ +AC3Db +MATERIAL "DefaultWhite" rgb 1.0000 1.0000 1.0000 amb 0.2000 0.2000 0.2000 emis 0.0000 0.0000 0.0000 spec 0.5000 0.5000 0.5000 shi 10 trans 1.0000 +MATERIAL "DefaultWhite" rgb 1.0000 1.0000 1.0000 amb 0.2000 0.2000 0.2000 emis 0.0000 0.0000 0.0000 spec 0.0250 0.0250 0.0250 shi 50 trans 1.0000 +OBJECT world +name "Blender_export__procedural_light.ac" +kids 1 +OBJECT poly +name "birdswarm" +numvert 4 +-0.0000019 -1.0000000 -1.0000000 +-0.0000005 1.0000000 -1.0000000 +0.0000005 -1.0000000 1.0000000 +0.0000019 1.0000000 1.0000000 +numsurf 1 +SURF 0X20 +mat 1 +refs 4 +1 0 0 +0 0 0 +2 0 0 +3 0 0 +kids 0 diff --git a/Models/Effects/Birds/birdswarm.xml b/Models/Effects/Birds/birdswarm.xml new file mode 100644 index 000000000..75f3de4db --- /dev/null +++ b/Models/Effects/Birds/birdswarm.xml @@ -0,0 +1,22 @@ + + + + + birdswarm1.xml + + + + birdswarm2.xml + + + + birdswarm3.xml + + + + birdswarm4.xml + + + + + diff --git a/Models/Effects/Birds/birdswarm1.xml b/Models/Effects/Birds/birdswarm1.xml new file mode 100644 index 000000000..c2f28d4b3 --- /dev/null +++ b/Models/Effects/Birds/birdswarm1.xml @@ -0,0 +1,25 @@ + + + + birds.ac + + + 0 + 0 + 200.0 + + + birds1 + scale + 50.0 + 50.0 + 50.0 + + + + Effects/birdswarm + birds1 + + + + diff --git a/Models/Effects/Birds/birdswarm2.xml b/Models/Effects/Birds/birdswarm2.xml new file mode 100644 index 000000000..d142ea917 --- /dev/null +++ b/Models/Effects/Birds/birdswarm2.xml @@ -0,0 +1,28 @@ + + + + birds.ac + + + 40 + 20 + 200.0 + + + birds1 + scale + 50.0 + 50.0 + 50.0 + + + + Effects/birdswarm + birds1 + + + + + + + diff --git a/Models/Effects/Birds/birdswarm3.xml b/Models/Effects/Birds/birdswarm3.xml new file mode 100644 index 000000000..79092d689 --- /dev/null +++ b/Models/Effects/Birds/birdswarm3.xml @@ -0,0 +1,25 @@ + + + + birds.ac + + + 60 + 5 + 190.0 + + + birds1 + scale + 50.0 + 50.0 + 50.0 + + + + Effects/birdswarm + birds1 + + + + diff --git a/Models/Effects/Birds/birdswarm4.xml b/Models/Effects/Birds/birdswarm4.xml new file mode 100644 index 000000000..fb16eed76 --- /dev/null +++ b/Models/Effects/Birds/birdswarm4.xml @@ -0,0 +1,25 @@ + + + + birds.ac + + + 85 + -30 + 210.0 + + + birds1 + scale + 50.0 + 50.0 + 50.0 + + + + Effects/birdswarm + birds1 + + + + diff --git a/Shaders/birds-ALS.frag b/Shaders/birds-ALS.frag new file mode 100644 index 000000000..0e0f43d21 --- /dev/null +++ b/Shaders/birds-ALS.frag @@ -0,0 +1,206 @@ +// -*-C++-*- + +uniform sampler2D texture; + +uniform float color_base_r; +uniform float color_base_g; +uniform float color_base_b; + +uniform float color_alt_r; +uniform float color_alt_g; +uniform float color_alt_b; + +uniform float visibility; +uniform float avisibility; +uniform float hazeLayerAltitude; +uniform float eye_alt; +uniform float terminator; +uniform float scattering; + +uniform float osg_SimulationTime; + + +varying vec3 vertex; +varying vec3 relPos; +varying vec3 normal; + +const float terminator_width = 200000.0; + +float Noise2D(in vec2 coord, in float wavelength); +float VoronoiNoise2D(in vec2 coord, in float wavelength, in float xrand, in float yrand); +float fog_func (in float targ, in float alt); + +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() +{ + +float noise = 0.0; + + +vec3 color_base = vec3 (color_base_r, color_base_g, color_base_b); +vec3 color_alt = vec3 (color_alt_r, color_alt_g, color_alt_b); +vec3 shadedFogColor = vec3(0.55, 0.67, 0.88); + + +vec3 viewDir = normalize(relPos); + + +vec2 lookup_coords = vertex.yz; +lookup_coords.x += 0.03* osg_SimulationTime; + +float domain_size = 0.05; +float r = length(vertex); + +float domain_noise = VoronoiNoise2D(lookup_coords, domain_size, 0.0, 0.0); +domain_noise = domain_noise * (1.0- smoothstep(0.5, 1.0, r)); + +if (domain_noise < 0.9) {discard;} + + + +// fogging + +float dist = length(relPos); +float delta_z = hazeLayerAltitude - eye_alt; +float transmission; +float vAltitude; +float delta_zv; +float H; +float distance_in_layer; +float transmission_arg; + + // angle with horizon + float ct = dot(vec3(0.0, 0.0, 1.0), relPos)/dist; + + + 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)) + { + 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; + } + } + + + + transmission_arg = (dist-distance_in_layer)/avisibility; + if (visibility < avisibility) + { + transmission_arg = transmission_arg + (distance_in_layer/visibility); + } + else + { + transmission_arg = transmission_arg + (distance_in_layer/avisibility); + } + + + + transmission = fog_func(transmission_arg, 0.0); + float lightArg = terminator/100000.0; + float earthShade = 0.6 * (1.0 - smoothstep(-terminator_width+ terminator, terminator_width + terminator, 0.0)) + 0.4; + + vec4 light_diffuse; + + + light_diffuse.b = light_func(lightArg , 1.330e-05, 0.264, 2.227, 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.a = 1.0; + + light_diffuse *=scattering; + + + float intensity = length(light_diffuse.rgb); + light_diffuse.rgb = intensity * normalize(mix(light_diffuse.rgb, shadedFogColor, 1.0 -smoothstep(0.4, 0.7,earthShade) )); + + +vec4 domainTexel; + + +if (domain_noise > 0.9) {domainTexel = vec4 (1.0, 1.0, 1.0, 1.0);} +else {domainTexel = vec4 (0.0, 0.0, 0.0, 0.0);} + + + +vec2 coords_raw = lookup_coords/domain_size; +coords_raw += vec2(0.5,0.5); +float coord_int_x = coords_raw.x - fract(coords_raw.x) ; +float coord_int_y = coords_raw.y - fract(coords_raw.y) ; + +vec2 domain_coords = vec2 (coords_raw.x - coord_int_x, coords_raw.y - coord_int_y); + +float domain_x = coords_raw.x - coord_int_x; + +domain_coords.y = clamp(domain_coords.y, 0.05, 0.95); + +domain_coords.x *=0.25; + +float shape_select = 0.0; + +if (domain_noise > 0.975) {shape_select = 0.25;} +else if (domain_noise > 0.95) {shape_select = 0.5;} +else if (domain_noise > 0.925) {shape_select = 0.75;} + +float t_fact = fract(osg_SimulationTime); + +if (t_fact > 0.75) {shape_select +=0.75;} +else if (t_fact > 0.5) {shape_select +=0.5;} +else if (t_fact > 0.25) {shape_select +=0.25;} + + +domain_coords.x += shape_select; + +vec4 shapeTexel = texture2D(texture, domain_coords); + +color_base.rgb = mix(color_alt.rgb, color_base.rgb, length(shapeTexel.rgb)/1.73); + +if ((domain_coords.y < 0.1) || (domain_coords.y > 0.9)) {shapeTexel.a = 0.0;} +if ((domain_x < 0.1) || (domain_x > 0.9)) {shapeTexel.a = 0.0;} + +domainTexel.rgb *= color_base.rgb; + +vec4 birdTexel; +birdTexel.rgb = domainTexel.rgb * light_diffuse; +birdTexel.a = domainTexel.a * shapeTexel.a * transmission; + + +gl_FragColor = birdTexel; + + +} diff --git a/Shaders/birds-ALS.vert b/Shaders/birds-ALS.vert new file mode 100644 index 000000000..f5c764eba --- /dev/null +++ b/Shaders/birds-ALS.vert @@ -0,0 +1,48 @@ +// -*-C++-*- + +#version 120 + + + + +varying vec3 vertex; +varying vec3 relPos; +varying vec3 normal; + +uniform float osg_SimulationTime; + +void main() +{ + +vec4 ep = gl_ModelViewMatrixInverse * vec4(0.0,0.0,0.0,1.0); + + vec4 l = gl_ModelViewMatrixInverse * vec4(0.0,0.0,1.0,1.0); + vec3 u = normalize(ep.xyz - l.xyz); + + vec3 absu = abs(u); + vec3 r = normalize(vec3(-u.y, u.x, 0.0)); + vec3 w = cross(u, r); + +vertex = gl_Vertex.xyz; +relPos = vertex - ep.xyz; +normal = gl_NormalMatrix * gl_Normal; + + gl_Position = vec4(0.0, 0.0, 0.0, 1.0); + gl_Position.xyz = gl_Vertex.x * u; + gl_Position.xyz += gl_Vertex.y * r; + gl_Position.xyz += gl_Vertex.z * w; + + gl_Position = gl_ModelViewProjectionMatrix * gl_Position; + +//vec4 offset = gl_ModelViewProjectionMatrix * vec4 (0.05* osg_SimulationTime, 0.0, 0.0, 1.0); + +//gl_Position +=offset; + +//gl_Position = ftransform(); +gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0; + +gl_FrontColor = vec4 (1.0,1.0,1.0,1.0); +gl_BackColor = gl_FrontColor; +} + +