浏览代码

split up the default files into (quite a few) small parts

e.g. the primitives from different sources (iq, cupe) have their own
includes now, as does the sphere tracer and the camera from iq's
"raymarching primitives" on shadertoy.
Lucas Stadler 10 年之前
父节点
当前提交
4cb58c6ae3
共有 1 个文件被更改,包括 35 次插入31 次删除
  1. 35 31
      glsl/defaultFiles.js

+ 35 - 31
glsl/defaultFiles.js

@ -5,25 +5,26 @@ files.builtin = {
5 5
void main() {
6 6
  gl_FragColor = vec4(gl_FragCoord.xy / iResolution, blue, 1.0);
7 7
}`,
8
  "default.frag": `const int MaximumRaySteps = 150;
9
const float MinimumDistance = 0.0001;
8
  "default.frag": `//#include "includes/sphere-tracer.frag"
9
//#include "includes/iq-primitives.frag"
10
//#include "includes/cupe-primitives.frag"
10 11
11
float DistanceEstimator(vec3 pos);
12
uniform vec3 offset; //#slider[(0.0,10.0,20.0),(0.0,10.0,20.0),(0.0,2.5,20.0)]
12 13
13
float trace(vec3 from, vec3 direction) {
14
	float totalDistance = 0.0;
15
  int stepsDone = 0;
16
	for (int steps = 0; steps < MaximumRaySteps; steps++) {
17
		vec3 p = from + totalDistance * direction;
18
		float distance = DistanceEstimator(p);
19
		totalDistance += distance;
20
    stepsDone = steps;
21
		if (distance < MinimumDistance) break;
22
	}
23
	return 1.0-float(stepsDone)/float(MaximumRaySteps);
14
float DistanceEstimator(vec3 pos) {
15
  pMod1(pos.x, offset.x);
16
  pMod1(pos.y, offset.y);
17
  pMod1(pos.z, offset.z + sin(iGlobalTime));
18
  //return sphere(pos);
19
  //return min(sphere(vec3(pos.x, pos.y - 0.5, pos.z), 0.75),
20
  //           udBox(pos, vec3(1.0, 0.3, 1.0)));
21
  return min(max(-sphere(pos), udBox(pos, vec3(0.75))),
22
             sphere(pos, 0.05 + 0.25 * (1.0 + sin(iGlobalTime * 0.5)*0.5)));
24 23
}
25 24
26
float sphere(vec3 pos) {
25
//#include "includes/default-main.frag"
26
`,
27
  "includes/iq-primitives.frag": `float sphere(vec3 pos) {
27 28
  return length(pos) - 1.0;
28 29
}
29 30
@ -34,28 +35,31 @@ float sphere(vec3 pos, float size) {
34 35
float udBox( vec3 p, vec3 b ) {
35 36
  return length(max(abs(p)-b,0.0));
36 37
}
37
38
float pMod1(inout float p, float size) {
38
`,
39
  "includes/cupe-primitives.frag": `float pMod1(inout float p, float size) {
39 40
  float halfsize = size * 0.5;
40 41
  float c = floor((p + halfsize)/size);
41 42
  p = mod(p+halfsize, size)-halfsize;
42 43
  return c;
43
}
44
45
uniform vec3 offset; //#slider[(0.0,10.0,20.0),(0.0,10.0,20.0),(0.0,2.5,20.0)]
44
}`,
45
  "includes/sphere-tracer.frag": `const int MaximumRaySteps = 150;
46
const float MinimumDistance = 0.0001;
46 47
47
float DistanceEstimator(vec3 pos) {
48
  pMod1(pos.x, offset.x);
49
  pMod1(pos.y, offset.y);
50
  pMod1(pos.z, offset.z + sin(iGlobalTime));
51
  //return sphere(pos);
52
  //return min(sphere(vec3(pos.x, pos.y - 0.5, pos.z), 0.75),
53
  //           udBox(pos, vec3(1.0, 0.3, 1.0)));
54
  return min(max(-sphere(pos), udBox(pos, vec3(0.75))),
55
             sphere(pos, 0.05 + 0.25 * (1.0 + sin(iGlobalTime * 0.5)*0.5)));
56
}
48
float DistanceEstimator(vec3 pos);
57 49
58
mat3 setCamera( in vec3 ro, in vec3 ta, float cr ) {
50
float trace(vec3 from, vec3 direction) {
51
	float totalDistance = 0.0;
52
  int stepsDone = 0;
53
	for (int steps = 0; steps < MaximumRaySteps; steps++) {
54
		vec3 p = from + totalDistance * direction;
55
		float distance = DistanceEstimator(p);
56
		totalDistance += distance;
57
    stepsDone = steps;
58
		if (distance < MinimumDistance) break;
59
	}
60
	return 1.0-float(stepsDone)/float(MaximumRaySteps);
61
}`,
62
  "includes/default-main.frag": `mat3 setCamera( in vec3 ro, in vec3 ta, float cr ) {
59 63
	vec3 cw = normalize(ta-ro);
60 64
	vec3 cp = vec3(sin(cr), cos(cr),0.0);
61 65
	vec3 cu = normalize( cross(cw,cp) );