volray

diff volray.p.glsl @ 1:57072295eb83

progress
author John Tsiombikas <nuclear@member.fsf.org>
date Mon, 02 Apr 2012 02:11:35 +0300
parents b050ce167ff1
children 3e53a16d4667
line diff
     1.1 --- a/volray.p.glsl	Sat Mar 31 02:08:42 2012 +0300
     1.2 +++ b/volray.p.glsl	Mon Apr 02 02:11:35 2012 +0300
     1.3 @@ -12,6 +12,7 @@
     1.4  	vec3 normal;
     1.5  };
     1.6  
     1.7 +vec3 sky(Ray ray);
     1.8  vec3 ray_march(Ray ray);
     1.9  vec3 shade(Ray ray, ISect isect);
    1.10  Ray get_primary_ray();
    1.11 @@ -21,30 +22,37 @@
    1.12  	Ray ray = get_primary_ray();
    1.13  
    1.14  	gl_FragColor = vec4(ray_march(ray), 1.0);
    1.15 +	//gl_FragColor = vec4(sky(ray), 1.0);
    1.16  }
    1.17  
    1.18 -/*vec3 sky(Ray ray)
    1.19 +vec3 sky(Ray ray)
    1.20  {
    1.21  	vec3 col1 = vec3(0.75, 0.78, 0.8);
    1.22  	vec3 col2 = vec3(0.56, 0.7, 1.0);
    1.23  
    1.24  	float t = max(ray.dir.y, -0.5);
    1.25  	return mix(col1, col2, t);
    1.26 -}*/
    1.27 +}
    1.28  
    1.29  vec3 ray_march(Ray ray)
    1.30  {
    1.31 -	const float ray_step = 0.05;
    1.32 +	const float ray_step = 0.1;
    1.33  	float energy = 1.0;
    1.34  	vec3 pos = ray.origin;
    1.35 +	float col = 0.0;
    1.36  
    1.37 -	// assuming view space
    1.38 -	while(pos.z < 1.0) {
    1.39 -		energy -= texture3D(volume, pos).x;
    1.40 +	for(int i=0; i<40; i++) {
    1.41 +		float val = texture3D(volume, pos).x;
    1.42 +		val *= energy;
    1.43 +		col += val;
    1.44 +		energy -= val;
    1.45 +		if(energy < 0.001) {
    1.46 +			break;
    1.47 +		}
    1.48  		pos += ray.dir * ray_step;
    1.49  	}
    1.50  
    1.51 -	return vec3(energy, energy, energy);
    1.52 +	return vec3(col, col, col);
    1.53  }
    1.54  
    1.55  vec3 shade(Ray ray, ISect isect)