qvolray
diff volray.p.glsl @ 7:f40e4edfee7e
shading
author | John Tsiombikas <nuclear@member.fsf.org> |
---|---|
date | Thu, 05 Apr 2012 00:52:11 +0300 |
parents | 0c3874aa717a |
children | ae10631bb11b |
line diff
1.1 --- a/volray.p.glsl Wed Apr 04 01:37:58 2012 +0300 1.2 +++ b/volray.p.glsl Thu Apr 05 00:52:11 2012 +0300 1.3 @@ -1,6 +1,8 @@ 1.4 uniform sampler3D volume; 1.5 uniform sampler2D ray_tex; 1.6 uniform sampler1D xfer_tex; 1.7 +uniform float ray_step; 1.8 +uniform float zclip; 1.9 1.10 struct Ray { 1.11 vec3 origin, dir; 1.12 @@ -12,14 +14,14 @@ 1.13 1.14 struct ISect { 1.15 bool hit; 1.16 - float t; 1.17 + float t0, t1; 1.18 vec3 pos; 1.19 vec3 normal; 1.20 }; 1.21 1.22 vec3 sky(Ray ray); 1.23 -vec3 ray_march(Ray ray); 1.24 -vec3 shade(Ray ray, ISect isect); 1.25 +vec3 ray_march(Ray ray, float t0, float t1); 1.26 +vec3 shade(Ray ray, vec3 pos, vec3 norm); 1.27 Ray get_primary_ray(); 1.28 ISect intersect_aabb(Ray ray, AABBox aabb); 1.29 1.30 @@ -32,38 +34,44 @@ 1.31 1.32 ISect res = intersect_aabb(ray, aabb); 1.33 if(res.hit) { 1.34 - ray.origin += ray.dir * res.t; 1.35 - color = ray_march(ray); 1.36 + color = ray_march(ray, res.t0, res.t1); 1.37 } 1.38 1.39 gl_FragColor = vec4(color, 1.0); 1.40 } 1.41 1.42 -vec3 sky(Ray ray) 1.43 -{ 1.44 - vec3 col1 = vec3(0.75, 0.78, 0.8); 1.45 - vec3 col2 = vec3(0.56, 0.7, 1.0); 1.46 - 1.47 - float t = max(ray.dir.y, -0.5); 1.48 - return mix(col1, col2, t); 1.49 -} 1.50 - 1.51 float eval(vec3 pos) 1.52 { 1.53 vec3 tc = pos * 0.5 + 0.5; 1.54 + 1.55 + if(tc.x < 0.0 || tc.y < 0.0 || tc.z < zclip || tc.x > 1.0 || tc.y > 1.0 || tc.z > 1.0) { 1.56 + return 0.0; 1.57 + } 1.58 + 1.59 return texture1D(xfer_tex, texture3D(volume, tc).x).x; 1.60 } 1.61 1.62 -vec3 ray_march(Ray ray) 1.63 +#define OFFS 0.01 1.64 +vec3 ray_march(Ray ray, float t0, float t1) 1.65 { 1.66 - const float ray_step = 0.1; 1.67 float energy = 1.0; 1.68 - vec3 pos = ray.origin; 1.69 - float col = 0.0; 1.70 + float t = t0; 1.71 + vec3 col = vec3(0.0, 0.0, 0.0); 1.72 1.73 - for(int i=0; i<40; i++) { 1.74 + 1.75 + while(t < t1) { 1.76 + vec3 pos = ray.origin + ray.dir * t; 1.77 + t += ray_step; 1.78 + 1.79 float val = eval(pos) * energy; 1.80 - col += val; 1.81 + vec3 norm; 1.82 + 1.83 + norm.x = eval(pos + vec3(OFFS, 0.0, 0.0)) - val; 1.84 + norm.y = eval(pos + vec3(0.0, OFFS, 0.0)) - val; 1.85 + norm.z = eval(pos + vec3(0.0, 0.0, OFFS)) - val; 1.86 + norm = normalize(norm); 1.87 + 1.88 + col += shade(ray, pos, norm) * val; 1.89 energy -= val; 1.90 if(energy < 0.001) { 1.91 break; 1.92 @@ -71,17 +79,17 @@ 1.93 pos += ray.dir * ray_step; 1.94 } 1.95 1.96 - return vec3(col, col, col); 1.97 + return col; 1.98 } 1.99 1.100 -vec3 shade(Ray ray, ISect isect) 1.101 +vec3 shade(Ray ray, vec3 pos, vec3 norm) 1.102 { 1.103 - vec3 ldir = normalize(vec3(10.0, 10.0, -10.0) - isect.pos); 1.104 + vec3 ldir = normalize(vec3(10.0, 10.0, -10.0) - pos); 1.105 vec3 vdir = -ray.dir; 1.106 vec3 hdir = normalize(ldir + vdir); 1.107 1.108 - float ndotl = dot(ldir, isect.normal); 1.109 - float ndoth = dot(hdir, isect.normal); 1.110 + float ndotl = dot(ldir, norm); 1.111 + float ndoth = dot(hdir, norm); 1.112 1.113 vec3 dcol = vec3(1.0, 1.0, 1.0) * max(ndotl, 0.0); 1.114 vec3 scol = vec3(0.6, 0.6, 0.6) * pow(max(ndoth, 0.0), 50.0); 1.115 @@ -102,10 +110,10 @@ 1.116 { 1.117 ISect res; 1.118 res.hit = false; 1.119 + res.t0 = res.t1 = 0.0; 1.120 1.121 if(ray.origin.x >= aabb.min.x && ray.origin.y >= aabb.min.y && ray.origin.z >= aabb.min.z && 1.122 ray.origin.x < aabb.max.x && ray.origin.y < aabb.max.y && ray.origin.z < aabb.max.z) { 1.123 - res.t = 0.0; 1.124 res.hit = true; 1.125 return res; 1.126 } 1.127 @@ -140,28 +148,9 @@ 1.128 return res; 1.129 } 1.130 1.131 - res.t = tmin; 1.132 + res.t0 = tmin; 1.133 + res.t1 = tmax; 1.134 res.hit = true; 1.135 - res.pos = ray.origin + ray.dir * res.t; 1.136 - 1.137 - /*if(res.pos.x > res.pos.y && res.pos.x > res.pos.z) { 1.138 - res.normal = vec3(1.0, 0.0, 0.0); 1.139 - } else if(res.pos.x < res.pos.y && res.pos.x < res.pos.z) { 1.140 - res.normal = vec3(-1.0, 0.0, 0.0); 1.141 - } else if(res.pos.y > res.pos.x && res.pos.y > res.pos.z) { 1.142 - res.normal = vec3(0.0, 1.0, 0.0); 1.143 - } else if(res.pos.y < res.pos.x && res.pos.y < res.pos.z) { 1.144 - res.normal = vec3(0.0, -1.0, 0.0); 1.145 - } else if(res.pos.z > res.pos.x && res.pos.z > res.pos.y) { 1.146 - res.normal = vec3(0.0, 0.0, 1.0); 1.147 - } else { 1.148 - res.normal = vec3(0.0, 0.9, -1.0); 1.149 - } 1.150 - if(res.pos.x < 0.0) { 1.151 - res.normal = vec3(1.0, 0.0, 0.0); 1.152 - } else { 1.153 - res.normal = vec3(0.0, 0.0, 1.0); 1.154 - }*/ 1.155 return res; 1.156 } 1.157