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 +}