rayfract
diff sdr/julia.p.glsl @ 1:03022062c464
lalal
author | John Tsiombikas <nuclear@siggraph.org> |
---|---|
date | Tue, 26 Oct 2010 08:45:37 +0300 |
parents | 09bb67c000bc |
children | dfe7c98cf373 |
line diff
1.1 --- a/sdr/julia.p.glsl Thu Oct 21 23:39:26 2010 +0300 1.2 +++ b/sdr/julia.p.glsl Tue Oct 26 08:45:37 2010 +0300 1.3 @@ -3,6 +3,8 @@ 1.4 uniform sampler2D ray_tex; 1.5 uniform float err_thres; 1.6 uniform int iter; 1.7 +uniform float reflectivity; 1.8 +uniform vec3 diffuse_color; 1.9 1.10 #define quat(s, x, y, z) vec4(x, y, z, s) 1.11 #define quat_identity() vec4(0.0, 0.0, 0.0, 1.0) 1.12 @@ -20,13 +22,18 @@ 1.13 vec4 qprime; 1.14 }; 1.15 1.16 +struct Material { 1.17 + vec3 kd, ks; 1.18 + float spow; 1.19 + float kr; 1.20 +}; 1.21 + 1.22 struct ISect { 1.23 bool hit; 1.24 float t; 1.25 vec3 pos; 1.26 vec3 normal; 1.27 - vec3 color; 1.28 - float kr; 1.29 + Material mat; 1.30 }; 1.31 1.32 ISect find_intersection(Ray ray); 1.33 @@ -44,6 +51,7 @@ 1.34 ISect ray_floor(Ray ray); 1.35 Ray get_primary_ray(); 1.36 1.37 +vec3 steps_color(int steps); 1.38 1.39 void main() 1.40 { 1.41 @@ -57,7 +65,7 @@ 1.42 1.43 if(res.hit) { 1.44 color += shade(ray, res) * energy; 1.45 - energy *= res.kr; 1.46 + energy *= res.mat.kr; 1.47 1.48 ray.origin = res.pos; 1.49 ray.dir = reflect(ray.dir, res.normal); 1.50 @@ -97,10 +105,10 @@ 1.51 float ndotl = dot(ldir, isect.normal); 1.52 float ndoth = dot(hdir, isect.normal); 1.53 1.54 - vec3 dcol = /*isect.color * max(ndotl, 0.0) */ amboc(isect); 1.55 - vec3 scol = vec3(1.0, 1.0, 1.0) * pow(max(ndoth, 0.0), 40.0); 1.56 + vec3 dcol = isect.mat.kd;// * abs(ndotl); 1.57 + vec3 scol = isect.mat.ks * pow(abs(ndoth), isect.mat.spow); 1.58 1.59 - return /*vec3(0.05, 0.05, 0.05) + */dcol;// + scol; 1.60 + return vec3(0.05, 0.05, 0.05) + dcol + scol; 1.61 } 1.62 1.63 #define AO_STEP 0.04 1.64 @@ -117,7 +125,8 @@ 1.65 sum += 1.0 / pow(2.0, fi) * (sample_dist - jdist); 1.66 } 1.67 1.68 - return 1.0 - AO_MAGIC * sum; 1.69 + float res = 1.0 - AO_MAGIC * sum; 1.70 + return clamp(res, 0.0, 1.0); 1.71 } 1.72 1.73 vec3 sky(Ray ray) 1.74 @@ -185,16 +194,19 @@ 1.75 return res; 1.76 } 1.77 1.78 +#define MIN_STEP 0.001 1.79 ISect ray_julia(Ray inray) 1.80 { 1.81 float dist_acc = 0.0; 1.82 Ray ray = inray; 1.83 ISect res; 1.84 1.85 + int i = 0; 1.86 for(float fi=0.0; ; fi+=0.1) { 1.87 + i++; 1.88 vec4 q = quat(ray.origin.x, ray.origin.y, ray.origin.z, 0.0); 1.89 1.90 - float dist = julia_dist(q); 1.91 + float dist = max(julia_dist(q), MIN_STEP); 1.92 1.93 ray.origin += ray.dir * dist; 1.94 dist_acc += dist; 1.95 @@ -204,9 +216,10 @@ 1.96 res.t = dist_acc; 1.97 res.pos = ray.origin; 1.98 res.normal = normalize(julia_grad(quat(res.pos.x, res.pos.y, res.pos.z, 0.0))); 1.99 - res.color = vec3(0.75, 0.8, 0.9);//abs(res.normal) * 0.2; 1.100 - //res.kr = 0.6; 1.101 - res.kr = 0.0; 1.102 + res.mat.kr = reflectivity; 1.103 + res.mat.kd = diffuse_color * amboc(res) * (1.0 - res.mat.kr); 1.104 + res.mat.ks = vec3(0.4, 0.4, 0.4);//vec3(res.mat.kr, res.mat.kr, res.mat.kr); 1.105 + res.mat.spow = 50.0; 1.106 break; 1.107 } 1.108 1.109 @@ -242,8 +255,8 @@ 1.110 res.hit = true; 1.111 res.t = min(t1, t2); 1.112 res.pos = ray.origin + ray.dir * res.t; 1.113 - res.color = vec3(1.0, 0.3, 0.2); 1.114 - res.normal = res.pos / rad; 1.115 + //res.mat.kd = vec3(1.0, 0.3, 0.2); 1.116 + //res.normal = res.pos / rad; 1.117 } 1.118 1.119 return res; 1.120 @@ -272,8 +285,10 @@ 1.121 res.hit = true; 1.122 1.123 float chess = mod(floor(res.pos.x) + floor(res.pos.z), 2.0); 1.124 - res.color = mix(vec3(0.498, 0.165, 0.149), vec3(0.776, 0.851, 0.847), chess); 1.125 - res.kr = 0.0; 1.126 + res.mat.kd = mix(vec3(0.498, 0.165, 0.149), vec3(0.776, 0.851, 0.847), chess); 1.127 + res.mat.ks = vec3(0.0, 0.0, 0.0); 1.128 + res.mat.spow = 1.0; 1.129 + res.mat.kr = 0.0; 1.130 } 1.131 return res; 1.132 } 1.133 @@ -287,3 +302,27 @@ 1.134 return ray; 1.135 } 1.136 1.137 + 1.138 +vec3 steps_color(int steps) 1.139 +{ 1.140 + if(steps <= 1) { 1.141 + return vec3(0.0, 0.5, 0.0); 1.142 + } else if(steps == 2) { 1.143 + return vec3(0.0, 1.0, 0.0); 1.144 + } else if(steps == 3) { 1.145 + return vec3(0.0, 0.0, 0.5); 1.146 + } else if(steps == 4) { 1.147 + return vec3(0.0, 0.0, 1.0); 1.148 + } else if(steps == 5) { 1.149 + return vec3(0.0, 0.5, 0.5); 1.150 + } else if(steps == 6) { 1.151 + return vec3(0.0, 1.0, 1.0); 1.152 + } else if(steps == 7) { 1.153 + return vec3(0.5, 0.0, 0.5); 1.154 + } else if(steps == 8) { 1.155 + return vec3(1.0, 0.0, 1.0); 1.156 + } else if(steps == 9) { 1.157 + return vec3(0.5, 0.0, 0.0); 1.158 + } 1.159 + return vec3(0.5 + float(steps - 9) / 10.0, 0.0, 0.0); 1.160 +}