Browse Source

pass shaders through a preprocessing step

it does a few things:

- adds a prelude (which defines precision and the default uniforms
    availlable)
- supports `//#include`ing other files
Lucas Stadler 10 years ago
parent
commit
1a7cf50635
5 changed files with 41 additions and 18 deletions
  1. 2 12
      glsl/defaultFiles.js
  2. 9 5
      glsl/files.js
  3. 1 0
      glsl/raymarching.html
  4. 1 1
      glsl/raymarching.js
  5. 28 0
      glsl/transformShader.js

+ 2 - 12
glsl/defaultFiles.js

1
files.current = "default.frag";
1
files.current = "default.frag";
2
files.builtin = {
2
files.builtin = {
3
  "colors.frag": `precision highp float;
4
5
uniform vec2 iResolution;
6
7
uniform float blue; //#slider[0.0,0.0,1.0]
3
  "colors.frag": `uniform float blue; //#slider[0.0,0.0,1.0]
8
4
9
void main() {
5
void main() {
10
  gl_FragColor = vec4(gl_FragCoord.xy / iResolution, blue, 1.0);
6
  gl_FragColor = vec4(gl_FragCoord.xy / iResolution, blue, 1.0);
11
}`,
7
}`,
12
  "default.frag": `precision highp float;
13
14
uniform float iGlobalTime;
15
uniform vec2 iResolution;
16
uniform vec3 iMouse;
17
18
const int MaximumRaySteps = 150;
8
  "default.frag": `const int MaximumRaySteps = 150;
19
const float MinimumDistance = 0.0001;
9
const float MinimumDistance = 0.0001;
20
10
21
float DistanceEstimator(vec3 pos);
11
float DistanceEstimator(vec3 pos);

+ 9 - 5
glsl/files.js

66
  return name in files.builtin || (files.prefix + name) in localStorage;
66
  return name in files.builtin || (files.prefix + name) in localStorage;
67
}
67
}
68
68
69
files.open = function(name) {
70
  files.current = name;
71
  document.title = files.makeName(name);
69
files.get = function(name) {
72
  if (name in files.builtin) {
70
  if (name in files.builtin) {
73
    files.currentFile = {"name": name, "content": files.builtin[name], "readonly": true};
71
    return {"name": name, "content": files.builtin[name], "readonly": true};
74
  } else {
72
  } else {
75
    files.currentFile = {"name": name, "content": localStorage[files.prefix + name], "readonly": false};
73
    return {"name": name, "content": localStorage[files.prefix + name], "readonly": false};
76
  }
74
  }
75
}
76
77
files.open = function(name) {
78
  files.current = name;
79
  document.title = files.makeName(name);
80
  files.currentFile = files.get(name);
77
  return files.currentFile;
81
  return files.currentFile;
78
}
82
}
79
83

+ 1 - 0
glsl/raymarching.html

11
    <script src="sliders.js"></script>
11
    <script src="sliders.js"></script>
12
    <script src="files.js"></script>
12
    <script src="files.js"></script>
13
    <script src="defaultFiles.js"></script>
13
    <script src="defaultFiles.js"></script>
14
    <script src="transformShader.js"></script>
14
    <script src="raymarching.js"></script>
15
    <script src="raymarching.js"></script>
15
  </body>
16
  </body>
16
</html>
17
</html>

+ 1 - 1
glsl/raymarching.js

124
    var options = options || {};
124
    var options = options || {};
125
    var tt = {};
125
    var tt = {};
126
    tt.canvas = canvas;
126
    tt.canvas = canvas;
127
    tt.fragmentShaderSrc = fragmentShaderSrc;
127
    tt.fragmentShaderSrc = transformShader(fragmentShaderSrc);
128
    
128
    
129
    tt.w = canvas.width = window.innerWidth;
129
    tt.w = canvas.width = window.innerWidth;
130
    tt.h = canvas.height = window.innerHeight;
130
    tt.h = canvas.height = window.innerHeight;

+ 28 - 0
glsl/transformShader.js

1
var prelude = `precision highp float;
2
3
uniform float iGlobalTime;
4
uniform vec2 iResolution;
5
uniform vec3 iMouse;
6
7
`;
8
9
function transformShader(shader) {
10
  var lines = shader.split("\n");
11
  lines = lines.map(function(line) {
12
    var match = line.match(/\/\/#include "(.*)"/);
13
    if (match) {
14
      var file = files.get(match[1]);
15
      if (!file.content) {
16
        throw new Error(`No such file: '${match[1]}'`);
17
      }
18
      return `//#includestart "${match[1]}" (start)
19
${file.content}
20
//#includeend "${match[1]}"
21
`
22
    } else {
23
      return line;
24
    }
25
  });
26
  
27
  return prelude + lines.join("\n");
28
}