volray

diff volray.p.glsl @ 0:b050ce167ff1

foo
author John Tsiombikas <nuclear@member.fsf.org>
date Sat, 31 Mar 2012 02:08:42 +0300
parents
children 57072295eb83
line diff
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/volray.p.glsl	Sat Mar 31 02:08:42 2012 +0300
     1.3 @@ -0,0 +1,72 @@
     1.4 +uniform sampler3D volume;
     1.5 +uniform sampler2D ray_tex;
     1.6 +
     1.7 +struct Ray {
     1.8 +	vec3 origin, dir;
     1.9 +};
    1.10 +
    1.11 +struct ISect {
    1.12 +	bool hit;
    1.13 +	float t;
    1.14 +	vec3 pos;
    1.15 +	vec3 normal;
    1.16 +};
    1.17 +
    1.18 +vec3 ray_march(Ray ray);
    1.19 +vec3 shade(Ray ray, ISect isect);
    1.20 +Ray get_primary_ray();
    1.21 +
    1.22 +void main()
    1.23 +{
    1.24 +	Ray ray = get_primary_ray();
    1.25 +
    1.26 +	gl_FragColor = vec4(ray_march(ray), 1.0);
    1.27 +}
    1.28 +
    1.29 +/*vec3 sky(Ray ray)
    1.30 +{
    1.31 +	vec3 col1 = vec3(0.75, 0.78, 0.8);
    1.32 +	vec3 col2 = vec3(0.56, 0.7, 1.0);
    1.33 +
    1.34 +	float t = max(ray.dir.y, -0.5);
    1.35 +	return mix(col1, col2, t);
    1.36 +}*/
    1.37 +
    1.38 +vec3 ray_march(Ray ray)
    1.39 +{
    1.40 +	const float ray_step = 0.05;
    1.41 +	float energy = 1.0;
    1.42 +	vec3 pos = ray.origin;
    1.43 +
    1.44 +	// assuming view space
    1.45 +	while(pos.z < 1.0) {
    1.46 +		energy -= texture3D(volume, pos).x;
    1.47 +		pos += ray.dir * ray_step;
    1.48 +	}
    1.49 +
    1.50 +	return vec3(energy, energy, energy);
    1.51 +}
    1.52 +
    1.53 +vec3 shade(Ray ray, ISect isect)
    1.54 +{
    1.55 +	vec3 ldir = normalize(vec3(10.0, 10.0, -10.0) - isect.pos);
    1.56 +	vec3 vdir = -ray.dir;
    1.57 +	vec3 hdir = normalize(ldir + vdir);
    1.58 +
    1.59 +	float ndotl = dot(ldir, isect.normal);
    1.60 +	float ndoth = dot(hdir, isect.normal);
    1.61 +
    1.62 +	vec3 dcol = vec3(1.0, 1.0, 1.0) * max(ndotl, 0.0);
    1.63 +	vec3 scol = vec3(0.6, 0.6, 0.6) * pow(max(ndoth, 0.0), 50.0);
    1.64 +
    1.65 +	return vec3(0.01, 0.01, 0.01) + dcol + scol;
    1.66 +}
    1.67 +
    1.68 +Ray get_primary_ray()
    1.69 +{
    1.70 +	Ray ray;
    1.71 +	vec2 tc = gl_TexCoord[0].xy;
    1.72 +	ray.dir = gl_NormalMatrix * normalize(texture2D(ray_tex, tc).xyz);
    1.73 +	ray.origin = (gl_ModelViewMatrix * vec4(0.0, 0.0, 0.0, 1.0)).xyz;
    1.74 +	return ray;
    1.75 +}