Skip to content

Commit d02fea0

Browse files
committed
Fixed the plasma shader.
1 parent 548f65e commit d02fea0

8 files changed

Lines changed: 87 additions & 20 deletions

File tree

example/test_plasma.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import 'package:chronosgl/chronosgl.dart';
22

33
void main() {
44

5-
ChronosGL chronosGL = new ChronosGL('#webgl-canvas');
5+
ChronosGL chronosGL = new ChronosGL('#webgl-canvas', useFramebuffer:false, fxShader: createPlasmaShader3());
66

77
ShaderProgram prg = chronosGL.createProgram(createPlasmaShader());
88

@@ -23,8 +23,8 @@ void main() {
2323
m.lookLeft(0.7);
2424

2525
m.setAnimateCallback((Node node, double time){
26-
m.rollLeft(time*0.001);
27-
m.lookLeft(time*0.001);
26+
m.rollLeft(time*0.0001);
27+
m.lookLeft(time*0.0001);
2828
});
2929

3030
prg.add(m);

example/test_plasma.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<html>
33
<head>
44
<meta charset="utf-8">
5-
<title>TestFx2</title>
5+
<title>TestPlasma</title>
66
</head>
77
<body style="height:100%; margin: 0; padding: 0">
88

lib/chronosgl.dart

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ class ChronosGL
109109
fxFramebuffer = new ChronosFramebuffer(gl, _canvas.width, _canvas.height);
110110
fxWall = _utils.getWall( fxFramebuffer.colorTexture, 1);
111111
fxWall.texture2 = fxFramebuffer.depthTexture;
112-
fxProgram = new ShaderProgram(this, fxShader == null ? createBasicShader() : fxShader, 'fx');
112+
fxProgram = new ShaderProgram(this, fxShader == null ? createTexturedShader() : fxShader, 'fx');
113113
fxProgram.add(fxWall);
114114
}
115115

@@ -157,6 +157,10 @@ class ChronosGL
157157
{
158158
prg.animate(elapsed);
159159
}
160+
if( fxProgram != null) {
161+
fxProgram.animate(elapsed);
162+
}
163+
160164
}
161165

162166
int _lastWidth = 0;

lib/src/shader/basic_shader.dart

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ ShaderObject createTexturedShader() {
1313
shaderObject.modelViewMatrixUniform = "uMVMatrix";
1414
shaderObject.perpectiveMatrixUniform = "uPMatrix";
1515
shaderObject.textureSamplerUniform = "uSampler";
16-
return generateShader(shaderObject, "", "gl_FragColor = texture2D(uSampler, vaTextureCoord);");
16+
shaderObject.fragmentShaderBody = "gl_FragColor = texture2D(uSampler, vaTextureCoord);";
17+
return generateShader(shaderObject);
1718
}
1819

1920
ShaderObject createLightShader() {
@@ -113,6 +114,8 @@ ShaderObject createPointSpritesShader() {
113114
shaderObject.modelViewMatrixUniform = "uMVMatrix";
114115
shaderObject.perpectiveMatrixUniform = "uPMatrix";
115116
shaderObject.textureSamplerUniform = "uSampler";
116-
return generateShader(shaderObject, "gl_PointSize = 1000.0/gl_Position.z;", "gl_FragColor = texture2D(uSampler, gl_PointCoord);\n gl_FragColor.a = 0.4;\n");
117+
shaderObject.vertexShaderBody = "gl_PointSize = 1000.0/gl_Position.z;";
118+
shaderObject.fragmentShaderBody = "gl_FragColor = texture2D(uSampler, gl_PointCoord);\n gl_FragColor.a = 0.4;\n";
119+
return generateShader(shaderObject);
117120
}
118121

lib/src/shader/debug_shader.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,8 @@ ShaderObject createDebugTexCoordsShader() {
4545
shaderObject.textureCoordinatesAttribute = "aTextureCoord";
4646
shaderObject.modelViewMatrixUniform = "uMVMatrix";
4747
shaderObject.perpectiveMatrixUniform = "uPMatrix";
48-
return generateShader(shaderObject, "", "gl_FragColor = vec4(vaTextureCoord, 1.0, 1.0);");
48+
shaderObject.fragmentShaderBody = "gl_FragColor = vec4(vaTextureCoord, 0.0, 1.0);";
49+
return generateShader(shaderObject);
4950
}
5051

5152
ShaderObject createDepthShader() {

lib/src/shader/generate_shader.dart

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
part of chronosgl;
22

3-
ShaderObject generateShader( ShaderObject shaderObject, String vertexShaderBody, String fragmentShaderBody) {
3+
ShaderObject generateShader( ShaderObject shaderObject) {
44

55
String vs = """
66
precision mediump float;
@@ -18,13 +18,14 @@ ShaderObject generateShader( ShaderObject shaderObject, String vertexShaderBody,
1818
""";
1919
}
2020

21+
vs += shaderObject.vertexShaderHeader+"\n";
2122
vs += "void main(void) {\n";
2223
vs += "gl_Position = ${shaderObject.perpectiveMatrixUniform} * ${shaderObject.modelViewMatrixUniform} * vec4(${shaderObject.vertexPositionAttribute}, 1.0);\n";
2324

2425
if( shaderObject.vertexPositionAttribute != null) {
2526
vs += "v${shaderObject.textureCoordinatesAttribute} = ${shaderObject.textureCoordinatesAttribute};\n";
2627
}
27-
vs += vertexShaderBody;
28+
vs += shaderObject.vertexShaderBody;
2829

2930
vs += "}\n";
3031

@@ -46,8 +47,9 @@ ShaderObject generateShader( ShaderObject shaderObject, String vertexShaderBody,
4647
fs += "uniform float ${shaderObject.timeUniform};\n";
4748
}
4849

50+
fs += shaderObject.fragmentShaderHeader+"\n";
4951
fs += "void main(void) {\n";
50-
fs += fragmentShaderBody;
52+
fs += shaderObject.fragmentShaderBody;
5153
fs += "\n}\n";
5254
shaderObject.fragmentShader = fs;
5355

lib/src/shader/plasma_shader.dart

Lines changed: 62 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,76 @@
11
part of chronosgl;
22

3+
// http://www.bidouille.org/prog/plasma
4+
// see also: https://www.shadertoy.com/view/XdX3Wn
5+
36
ShaderObject createPlasmaShader() {
47
ShaderObject shaderObject = new ShaderObject("Plasma");
58

9+
shaderObject.vertexPositionAttribute = "aVertexPosition";
10+
shaderObject.textureCoordinatesAttribute = "_coords";
11+
shaderObject.modelViewMatrixUniform = "uMVMatrix";
12+
shaderObject.perpectiveMatrixUniform = "uPMatrix";
13+
shaderObject.timeUniform = "u_time";
14+
15+
shaderObject.fragmentShaderHeader = "#define PI 3.1415926535897932384626433832795\n vec2 u_k = vec2(10.0,10.0);\n";
16+
17+
shaderObject.fragmentShaderBody = """
18+
float v = 0.0;
19+
vec2 c = v_coords * u_k - u_k/2.0;
20+
v += sin((c.x+u_time));
21+
v += sin((c.y+u_time)/2.0);
22+
v += sin((c.x+c.y+u_time)/2.0);
23+
c += u_k/2.0 * vec2(sin(u_time/3.0), cos(u_time/2.0));
24+
v += sin(sqrt(c.x*c.x+c.y*c.y+1.0)+u_time);
25+
v = v/2.0;
26+
vec3 col1 = vec3(1.0, sin(PI*v), cos(PI*v));
27+
vec3 col2 = vec3(sin(PI*v), cos(PI*v), -1.0);
28+
vec3 col = mix(col1, col2, sin(u_time)*.5+.5);
29+
gl_FragColor = vec4(col*.5 + .5, 1.0);
30+
""";
31+
32+
return generateShader(shaderObject);
33+
}
34+
35+
ShaderObject createPlasmaShader2() {
36+
ShaderObject shaderObject = new ShaderObject("Plasma");
37+
638
shaderObject.vertexPositionAttribute = "aVertexPosition";
739
shaderObject.textureCoordinatesAttribute = "aTextureCoord";
840
shaderObject.modelViewMatrixUniform = "uMVMatrix";
941
shaderObject.perpectiveMatrixUniform = "uPMatrix";
1042
shaderObject.timeUniform = "time";
1143

12-
// #define PI 3.1415926535897932384626433832795
13-
14-
String fragmentShaderBody = """
15-
vec4 newColor = vec4(vaTextureCoord, 1.0, 1.0);
16-
//float x = min(vaTextureCoord.s, 1.0 - vaTextureCoord.s);
17-
//float y = vaTextureCoord.t;
18-
//newColor.g = sin(x * cos(time/15.0) * 120.0) + cos(y * sin(time/10.0) * 120.0) + sin(sqrt(y * y + x * x) * 40.0);
19-
gl_FragColor = newColor;
44+
shaderObject.fragmentShaderBody = """
45+
float x = vaTextureCoord.x;
46+
float y = vaTextureCoord.y;
47+
gl_FragColor = vec4(1,sin(x * cos(time/15.0) * 120.0) + cos(y * sin(time/10.0) * 120.0) + sin(sqrt(y * y + x * x) * 40.0),1,1);
2048
""";
2149

22-
return generateShader(shaderObject, "", fragmentShaderBody);
50+
return generateShader(shaderObject);
2351
}
52+
53+
ShaderObject createPlasmaShader3() {
54+
ShaderObject shaderObject = new ShaderObject("Plasma");
55+
56+
shaderObject.vertexPositionAttribute = "aVertexPosition";
57+
shaderObject.textureCoordinatesAttribute = "aTextureCoord";
58+
shaderObject.modelViewMatrixUniform = "uMVMatrix";
59+
shaderObject.perpectiveMatrixUniform = "uPMatrix";
60+
shaderObject.timeUniform = "time";
61+
62+
shaderObject.fragmentShaderBody = """
63+
float x = vaTextureCoord.x*1000.0; // gl_FragCoord.x;
64+
float y = vaTextureCoord.y*1000.0; // gl_FragCoord.y;
65+
float mov0 = x+y+cos(sin(time)*2.)*100.+sin(x/100.)*1000.;
66+
float mov1 = y / 720.0 / 0.2 + time;
67+
float mov2 = x / 1280.0 / 0.2;
68+
float c1 = abs(sin(mov1+time)/2.+mov2/2.-mov1-mov2+time);
69+
float c2 = abs(sin(c1+sin(mov0/1000.+time)+sin(y/40.+time)+sin((x+y)/100.)*3.));
70+
float c3 = abs(sin(c2+cos(mov1+mov2+c2)+cos(mov2)+sin(x/1000.)));
71+
gl_FragColor = vec4( c1,c2,c3,1.0);
72+
""";
73+
74+
return generateShader(shaderObject);
75+
}
76+

lib/src/shader_program.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@ class ShaderObject {
1717
String cameraFar;
1818
String size; // canvas width and height
1919
String timeUniform;
20+
String vertexShaderHeader="";
21+
String vertexShaderBody="";
22+
String fragmentShaderHeader="";
23+
String fragmentShaderBody="";
2024
}
2125

2226
class ShaderProgram implements Drawable {

0 commit comments

Comments
 (0)