volray

diff volray.p.glsl @ 5:0c3874aa717a

slice
author John Tsiombikas <nuclear@member.fsf.org>
date Wed, 04 Apr 2012 01:37:33 +0300
parents 3e53a16d4667
children f40e4edfee7e
line diff
     1.1 --- a/volray.p.glsl	Mon Apr 02 17:59:46 2012 +0300
     1.2 +++ b/volray.p.glsl	Wed Apr 04 01:37:33 2012 +0300
     1.3 @@ -21,19 +21,19 @@
     1.4  vec3 ray_march(Ray ray);
     1.5  vec3 shade(Ray ray, ISect isect);
     1.6  Ray get_primary_ray();
     1.7 -bool intersect_aabb(Ray ray, AABBox aabb, out float t);
     1.8 +ISect intersect_aabb(Ray ray, AABBox aabb);
     1.9  
    1.10  void main()
    1.11  {
    1.12 -	const AABBox aabb = AABBox(vec3(0.0, 0.0, 0.0), vec3(1.0, 1.0, 1.0));
    1.13 +	const AABBox aabb = AABBox(vec3(-1.0, -1.0, -1.0), vec3(1.0, 1.0, 1.0));
    1.14  	Ray ray = get_primary_ray();
    1.15  
    1.16  	vec3 color = vec3(0.0, 0.0, 0.0);
    1.17  
    1.18 -	float start_t;
    1.19 -	if(intersect_aabb(ray, aabb, start_t)) {
    1.20 -		ray.origin += ray.dir * start_t;
    1.21 -		color = vec3(1.0, 0.0, 0.0);//ray_march(ray);
    1.22 +	ISect res = intersect_aabb(ray, aabb);
    1.23 +	if(res.hit) {
    1.24 +		ray.origin += ray.dir * res.t;
    1.25 +		color = ray_march(ray);
    1.26  	}
    1.27  
    1.28  	gl_FragColor = vec4(color, 1.0);
    1.29 @@ -50,7 +50,8 @@
    1.30  
    1.31  float eval(vec3 pos)
    1.32  {
    1.33 -	return texture1D(xfer_tex, texture3D(volume, pos).x).x;
    1.34 +	vec3 tc = pos * 0.5 + 0.5;
    1.35 +	return texture1D(xfer_tex, texture3D(volume, tc).x).x;
    1.36  }
    1.37  
    1.38  vec3 ray_march(Ray ray)
    1.39 @@ -97,11 +98,16 @@
    1.40  	return ray;
    1.41  }
    1.42  
    1.43 -bool intersect_aabb(Ray ray, AABBox aabb, out float t)
    1.44 +ISect intersect_aabb(Ray ray, AABBox aabb)
    1.45  {
    1.46 +	ISect res;
    1.47 +	res.hit = false;
    1.48 +
    1.49  	if(ray.origin.x >= aabb.min.x && ray.origin.y >= aabb.min.y && ray.origin.z >= aabb.min.z &&
    1.50  			ray.origin.x < aabb.max.x && ray.origin.y < aabb.max.y && ray.origin.z < aabb.max.z) {
    1.51 -		return true;
    1.52 +		res.t = 0.0;
    1.53 +		res.hit = true;
    1.54 +		return res;
    1.55  	}
    1.56  
    1.57  	vec4 bbox[2];
    1.58 @@ -119,7 +125,7 @@
    1.59  	float tymax = (bbox[1 - ysign].y - ray.origin.y) * invdiry;
    1.60  
    1.61  	if(tmin > tymax || tymin > tmax) {
    1.62 -		return false;
    1.63 +		return res;
    1.64  	}
    1.65  
    1.66  	if(tymin > tmin) tmin = tymin;
    1.67 @@ -131,10 +137,31 @@
    1.68  	float tzmax = (bbox[1 - zsign].z - ray.origin.z) * invdirz;
    1.69  
    1.70  	if(tmin > tzmax || tzmin > tmax) {
    1.71 -		return false;
    1.72 +		return res;
    1.73  	}
    1.74  
    1.75 -	t = tmin;
    1.76 -	return tmin < 1.0 && tmax > 0.0;
    1.77 +	res.t = tmin;
    1.78 +	res.hit = true;
    1.79 +	res.pos = ray.origin + ray.dir * res.t;
    1.80 +
    1.81 +	/*if(res.pos.x > res.pos.y && res.pos.x > res.pos.z) {
    1.82 +		res.normal = vec3(1.0, 0.0, 0.0);
    1.83 +	} else if(res.pos.x < res.pos.y && res.pos.x < res.pos.z) {
    1.84 +		res.normal = vec3(-1.0, 0.0, 0.0);
    1.85 +	} else if(res.pos.y > res.pos.x && res.pos.y > res.pos.z) {
    1.86 +		res.normal = vec3(0.0, 1.0, 0.0);
    1.87 +	} else if(res.pos.y < res.pos.x && res.pos.y < res.pos.z) {
    1.88 +		res.normal = vec3(0.0, -1.0, 0.0);
    1.89 +	} else if(res.pos.z > res.pos.x && res.pos.z > res.pos.y) {
    1.90 +		res.normal = vec3(0.0, 0.0, 1.0);
    1.91 +	} else {
    1.92 +		res.normal = vec3(0.0, 0.9, -1.0);
    1.93 +	}
    1.94 +	if(res.pos.x < 0.0) {
    1.95 +		res.normal = vec3(1.0, 0.0, 0.0);
    1.96 +	} else {
    1.97 +		res.normal = vec3(0.0, 0.0, 1.0);
    1.98 +	}*/
    1.99 +	return res;
   1.100  }
   1.101