-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathfluid2d.txt
127 lines (95 loc) · 2.63 KB
/
fluid2d.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
// | - v - |
// u s u
// | - v - |
uniform vec2 scale_inv;
/////////////////////////////////////////
vec4 value4( sampler2D F, vec2 p ) {
return texture2D( F, p * scale_inv );
}
vec2 value2( sampler2D F, vec2 p ) {
return texture2D( F, p * scale_inv ).xy;
}
vec value( sampler2D F, vec2 p ) {
return texture2D( F, p * scale_inv ).x;
}
vec value_x( sampler2D F, vec2 p ) {
return texture2D( F, p * scale_inv ).x;
}
vec value_y( sampler2D F, vec2 p ) {
return texture2D( F, p * scale_inv ).y;
}
/////////////////////////////////////////
vec4 advect( sampler2D F, sampler2D U, vec2 p, float dt ) {
vec2 u = value2( U, p );
return value4( F, p - u * dt ); // higher order
}
vec2 force( sampler2D U, vec2 p, float acc, float dt ) {
vec2 u = value2( U, p );
return u + acc * dt;
}
vec4 jacobi( sampler2D F, sampler2D G, vec2 p, vec2 e ) {
vec4 f_l = value4( F, p + vec2( -1.0, 0.0 ) );
vec4 f_r = value4( F, p + vec2( +1.0, 0.0 ) );
vec4 f_b = value4( F, p + vec2( 0.0, -1.0 ) );
vec4 f_t = value4( F, p + vec2( 0.0, +1.0 ) );
vec4 g = value4( G, p );
return ( f_l + f_r + f_b + f_t + g * e.x ) * e.y;
}
float div( sampler2D F, vec2 p ) {
float x_l = value_x( F, p + vec2( -1.0, 0.0 ) );
float x_r = value_x( F, p + vec2( +1.0, 0.0 ) );
float y_b = value_y( F, p + vec2( 0.0, -1.0 ) );
float y_t = value_y( F, p + vec2( 0.0, +1.0 ) );
return ( ( x_r - x_l ) + ( y_t - y_b ) ) * 0.5;
}
vec2 grad( sampler2D F, vec2 p ) {
float f_l = value( F, p + vec2( -1.0, 0.0 ) );
float f_r = value( F, p + vec2( +1.0, 0.0 ) );
float f_b = value( F, p + vec2( 0.0, -1.0 ) );
float f_t = value( F, p + vec2( 0.0, +1.0 ) );
return vec2( f_r - f_l, f_t - f_b ) * 0.5;
}
/////////////////////////////////////////
#ifdef PASS_ADVERT
uniform sampler2D F, U;
uniform float dt;
void main( void ) {
vec2 p = gl_FragCoord.xy;
gl_FragColor = advert( F, U, p, dt );
}
#endif
/////////////////////////////////////////
#ifdef PASS_FORCE
uniform sampler2D U;
uniform float acc, dt;
void main( void ) {
vec2 p = gl_FragCoord.xy;
gl_FragColor = vec4( force( U, p, acc, dt ), 0.0, 0.0 );
}
#endif
/////////////////////////////////////////
#ifdef PASS_DIV
uniform sampler2D U;
void main( void ) {
vec2 p = gl_FragCoord.xy;
gl_FragColor = vec4( div( U, p ) );
}
#endif
/////////////////////////////////////////
#ifdef PASS_JACOBI
uniform sampler2D F, G;
vec2 e;
void main( void ) {
vec2 p = gl_FragCoord.xy;
gl_FragColor = jacobi( F, G, p, e );
}
#endif
/////////////////////////////////////////
#ifdef PASS_GRAD
uniform sampler2D F, U;
vec2 e;
void main( void ) {
vec2 p = gl_FragCoord.xy;
gl_FragColor = vec4( value2( F, p ) - grad( U, p ), 0.0, 0.0 );
}
#endif