火焰效果—OpenGL着色器(Shader)和GLSL程序
效果图
程序代码
#ifdef GL_FRAGMENT_PRECISION_HIGH
precision highp float;
#else
precision mediump float;
#endif
uniform float time;
uniform vec2 resolution;
void main( void )
{
vec2 pos = -1. + 2.*gl_FragCoord.xy / resolution.xy;
pos *= vec2(resolution.x / resolution.y, 1.) * 3.;
if(pos.y>-2.*4.2)
{
for(float baud = 1.; baud < 9.; baud += 1.)
{
pos.y += 0.2*sin(4.20*time/(1.+baud))/(1.+baud);
pos.x += 0.1*cos(pos.y/4.20+2.40*time/(1.+baud))/(1.+baud);
}
pos.y += 0.04*fract(sin(time*60.));
}
vec3 color = vec3(0.,0.,0.);
float p =.004;
float y = -pow(abs(pos.x), 4.2)/p;
float dir = abs(pos.y - y)*sin(.3);
if(dir < 0.7)
{
color.rg += smoothstep(0.,1.,.75-dir);
color.g /=2.4;
}
color *= (0.2 + abs(pos.y/4.2 + 4.2)/4.2);
color += pow(color.r, 1.1);
color *= cos(-0.5+pos.y*0.4);
pos.y += 1.5;
vec3 dolor = vec3(0.,0.,0.0);
y = -pow(abs(pos.x), 4.2)/(4.2*p)*4.2;
dir = abs(pos.y - y)*sin(1.1);
if(dir < 0.7)
{
dolor.bg += smoothstep(0., 1., .75-dir);
dolor.g /=2.4;
}
dolor *= (0.2 + abs((pos.y/4.2+4.2))/4.2);
dolor += pow(color.b,1.1);
dolor *= cos(-0.6+pos.y*0.4);
color = (color+dolor)/2.;
gl_FragColor = vec4(vec3(color) , 1.0 );
}