Introduce detailed version of thruster flame
This commit is contained in:
parent
8c3a321c21
commit
5fc5e8263f
2 changed files with 141 additions and 2 deletions
141
Shaders/thrustflame-ALS-detailed.frag
Normal file
141
Shaders/thrustflame-ALS-detailed.frag
Normal file
|
@ -0,0 +1,141 @@
|
|||
// -*-C++-*-
|
||||
|
||||
#version 120
|
||||
|
||||
varying vec3 vertex;
|
||||
varying vec3 viewDir;
|
||||
|
||||
uniform float osg_SimulationTime;
|
||||
uniform float thrust_collimation;
|
||||
uniform float flame_radius_fraction;
|
||||
uniform float thrust_density;
|
||||
uniform float base_flame_density;
|
||||
uniform float shock_frequency;
|
||||
uniform float noise_strength;
|
||||
uniform float noise_scale;
|
||||
uniform float deflection_coeff;
|
||||
|
||||
uniform float flame_color_low_r;
|
||||
uniform float flame_color_low_g;
|
||||
uniform float flame_color_low_b;
|
||||
|
||||
uniform float flame_color_high_r;
|
||||
uniform float flame_color_high_g;
|
||||
uniform float flame_color_high_b;
|
||||
|
||||
uniform float base_flame_r;
|
||||
uniform float base_flame_g;
|
||||
uniform float base_flame_b;
|
||||
|
||||
uniform int use_shocks;
|
||||
uniform int use_noise;
|
||||
|
||||
float Noise3D(in vec3 coord, in float wavelength);
|
||||
|
||||
|
||||
const int n_steps = 25;
|
||||
|
||||
float spherical_smoothstep (in vec3 pos)
|
||||
{
|
||||
|
||||
float l = length(vec3 (pos.x/2.0, pos.y,pos.z) );
|
||||
|
||||
return 10.0 * thrust_density * base_flame_density * (1.0 - smoothstep(0.5* flame_radius_fraction, flame_radius_fraction, l));
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
float thrust_flame (in vec3 pos)
|
||||
{
|
||||
|
||||
|
||||
float noise = 0.0;
|
||||
|
||||
pos.z +=8.0 * deflection_coeff;
|
||||
|
||||
float d_rad = length(pos.yz - vec2 (0.0, deflection_coeff * pos.x * pos.x));
|
||||
float longFade = pos.x/5.0;
|
||||
|
||||
float density = 1.0 - longFade;
|
||||
float radius = flame_radius_fraction + thrust_collimation * 1.0 * pow((pos.x+0.1),0.5);
|
||||
|
||||
if (d_rad > radius) {return 0.0;}
|
||||
|
||||
|
||||
if (use_noise ==1)
|
||||
{
|
||||
noise = Noise3D(vec3(pos.x - osg_SimulationTime * 30.0 , pos.y, pos.z), noise_scale);
|
||||
}
|
||||
|
||||
density *= (1.0 - smoothstep(0.125, radius, d_rad)) * (1.0 - noise_strength + noise_strength* noise);
|
||||
|
||||
if (use_shocks == 1)
|
||||
{
|
||||
float shock = sin(pos.x * 10.0 * shock_frequency);
|
||||
density += shock * shock * shock * shock * (1.0 - longFade) * (1.0 - smoothstep(0.25*flame_radius_fraction, 0.5*flame_radius_fraction, d_rad)) * (1.0 - smoothstep(0.0, 1.0, thrust_collimation));
|
||||
}
|
||||
|
||||
|
||||
return 10.0 * thrust_density * density / (radius/0.2);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void main()
|
||||
{
|
||||
|
||||
vec3 vDir = normalize(viewDir);
|
||||
|
||||
float x_E, y_E, z_E;
|
||||
|
||||
if (vDir.x > 0.0) {x_E = 5.0;} else {x_E = 0.0;}
|
||||
if (vDir.y > 0.0) {y_E = 1.0;} else {y_E = -1.0;}
|
||||
if (vDir.z > 0.0) {z_E = 1.0;} else {z_E = -1.0;}
|
||||
|
||||
float t_x = (x_E - vertex.x) / vDir.x;
|
||||
float t_y = (y_E - vertex.y) / vDir.y;
|
||||
float t_z = (z_E - vertex.z) / vDir.z;
|
||||
|
||||
float t_min = min(t_x, t_y);
|
||||
t_min = min(t_min, t_z);
|
||||
|
||||
|
||||
float dt = t_min / float(n_steps);
|
||||
|
||||
vec3 step = viewDir * dt;
|
||||
vec3 pos = vertex;
|
||||
|
||||
float density1 = 0.0;
|
||||
float density2 = 0.0;
|
||||
|
||||
|
||||
|
||||
for (int i = 0; i < n_steps; i++)
|
||||
{
|
||||
pos = pos + step;
|
||||
density1 += spherical_smoothstep(pos) * dt;
|
||||
density2 += thrust_flame(pos) * dt;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
float density = density1 + density2;
|
||||
density = 1.0 - exp(-density);
|
||||
|
||||
density1 = 1.0 - exp(-density1);
|
||||
density2 = 1.0 - exp(-density2);
|
||||
|
||||
|
||||
vec3 flame_color_low = vec3 (flame_color_low_r, flame_color_low_g, flame_color_low_b);
|
||||
vec3 flame_color_high = vec3 (flame_color_high_r, flame_color_high_g, flame_color_high_b);
|
||||
|
||||
vec3 color = mix(flame_color_low, flame_color_high, density2);
|
||||
color = mix(color, vec3(0.8, 1.0, 1.0), density1);
|
||||
|
||||
vec4 finalColor = vec4 (color.rgb, density);
|
||||
|
||||
|
||||
gl_FragColor = finalColor;
|
||||
}
|
|
@ -30,7 +30,6 @@ uniform float base_flame_b;
|
|||
uniform int use_shocks;
|
||||
uniform int use_noise;
|
||||
|
||||
float Noise3D(in vec3 coord, in float wavelength);
|
||||
float Noise2D(in vec2 coord, in float wavelength);
|
||||
|
||||
const int n_steps = 15;
|
||||
|
@ -50,7 +49,6 @@ float thrust_flame (in vec3 pos)
|
|||
{
|
||||
|
||||
|
||||
//float noise = Noise3D(vec3(pos.x - osg_SimulationTime * 20.0 , pos.y, pos.z), 0.3);
|
||||
float noise = 0.0;
|
||||
|
||||
pos.z +=8.0 * deflection_coeff;
|
||||
|
|
Loading…
Reference in a new issue