Browse Source

tutorial: tweak noise shader once more, and add a few code comments.

legacy
Sam Hocevar sam 12 years ago
parent
commit
0d78d14145
1 changed files with 15 additions and 15 deletions
  1. +15
    -15
      tutorial/03_noise.lolfx

+ 15
- 15
tutorial/03_noise.lolfx View File

@@ -6,8 +6,7 @@ uniform float u_Time;


attribute vec2 in_Position; attribute vec2 in_Position;


varying vec2 pass_Position;
varying mat2 pass_Rotation;
varying vec4 pass_Position;
varying vec3 water[4]; varying vec3 water[4];
varying vec3 fire[4]; varying vec3 fire[4];


@@ -30,13 +29,15 @@ void main(void)


/* Noise sampling points for fire */ /* Noise sampling points for fire */
p_pos = 16.0 * p_pos - r * vec3(0.0, mod289(u_Time) * 128.0, 0.0); p_pos = 16.0 * p_pos - r * vec3(0.0, mod289(u_Time) * 128.0, 0.0);
fire[0] = p_pos / 2.0 + p_time;
fire[1] = p_pos / 4.0 + p_time;
fire[0] = p_pos / 2.0 + p_time * 2.0;
fire[1] = p_pos / 4.0 + p_time * 1.5;
fire[2] = p_pos / 8.0 + p_time; fire[2] = p_pos / 8.0 + p_time;
fire[3] = p_pos / 16.0 + p_time; fire[3] = p_pos / 16.0 + p_time;


pass_Position = in_Position;
pass_Rotation = mat2(cos(u_Time), sin(u_Time), -sin(u_Time), cos(u_Time));
/* Pass rotated screen coordinates */
pass_Position.xy = in_Position;
mat2 rot = mat2(cos(u_Time), sin(u_Time), -sin(u_Time), cos(u_Time));
pass_Position.zw = rot * in_Position;


gl_Position = vec4(in_Position, 0.0, 1.0); gl_Position = vec4(in_Position, 0.0, 1.0);
} }
@@ -47,8 +48,7 @@ void main(void)


uniform float u_Time; uniform float u_Time;


varying vec2 pass_Position;
varying mat2 pass_Rotation;
varying vec4 pass_Position;
varying vec3 water[4]; varying vec3 water[4];
varying vec3 fire[4]; varying vec3 fire[4];


@@ -87,15 +87,13 @@ float noise3d(vec3 p)


void main(void) void main(void)
{ {
vec2 tmp = pass_Rotation * pass_Position;
float test = tmp.x * tmp.y + sin(3.0 * u_Time);

/* Add some garbage noise */
vec2 d = vec2(16.0, 9.0) * pass_Position;
/* Dither the transition between water and fire */
float test = pass_Position.z * pass_Position.w + sin(2.0 * u_Time);
vec2 d = vec2(16.0, 9.0) * pass_Position.xy;
test += 0.5 * (length(fract(d) - 0.5) - length(fract(d + 0.5) - 0.5)); test += 0.5 * (length(fract(d) - 0.5) - length(fract(d + 0.5) - 0.5));


/* Compute 4 octaves of noise */
vec3 points[4] = (test > 0.0) ? fire : water; vec3 points[4] = (test > 0.0) ? fire : water;

vec4 n = vec4(noise3d(points[0]), vec4 n = vec4(noise3d(points[0]),
noise3d(points[1]), noise3d(points[1]),
noise3d(points[2]), noise3d(points[2]),
@@ -105,9 +103,10 @@ void main(void)


if (test > 0.0) if (test > 0.0)
{ {
/* Use noise results for fire */
float p = dot(n, vec4(0.125, 0.125, 0.25, 0.5)); float p = dot(n, vec4(0.125, 0.125, 0.25, 0.5));


/* Fade out by adding [-.5,.5] */
/* Fade to black on top of screen */
p -= pass_Position.y * 0.8 + 0.25; p -= pass_Position.y * 0.8 + 0.25;
p = max(p, 0.0); p = max(p, 0.0);
p = min(p, 1.0); p = min(p, 1.0);
@@ -121,6 +120,7 @@ void main(void)
} }
else else
{ {
/* Use noise results for water */
float p = dot(abs(2.0 * n - 1.0), float p = dot(abs(2.0 * n - 1.0),
vec4(0.5, 0.25, 0.125, 0.125)); vec4(0.5, 0.25, 0.125, 0.125));
float q = sqrt(p); float q = sqrt(p);


Loading…
Cancel
Save