Explorar el Código

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 %!s(int64=10) %!d(string=hace) años
padre
commit
1a7cf50635
Se han modificado 5 ficheros con 41 adiciones y 18 borrados
  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,21 +1,11 @@
1 1
files.current = "default.frag";
2 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 5
void main() {
10 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 9
const float MinimumDistance = 0.0001;
20 10
21 11
float DistanceEstimator(vec3 pos);

+ 9 - 5
glsl/files.js

@ -66,14 +66,18 @@ files.exists = function(name) {
66 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 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 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 81
  return files.currentFile;
78 82
}
79 83

+ 1 - 0
glsl/raymarching.html

@ -11,6 +11,7 @@
11 11
    <script src="sliders.js"></script>
12 12
    <script src="files.js"></script>
13 13
    <script src="defaultFiles.js"></script>
14
    <script src="transformShader.js"></script>
14 15
    <script src="raymarching.js"></script>
15 16
  </body>
16 17
</html>

+ 1 - 1
glsl/raymarching.js

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

+ 28 - 0
glsl/transformShader.js

@ -0,0 +1,28 @@
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
}