nuclear@10: #version 120 nuclear@10: nuclear@4: uniform sampler3D vol_tex; nuclear@4: uniform sampler1D xfer_tex; nuclear@4: nuclear@10: uniform vec3 light_dir[3] = vec3[3]( nuclear@9: vec3(0.5, 0.5, 1.0), nuclear@9: vec3(-1.0, 0.2, 0.5), nuclear@9: vec3(-0.2, 0.0, -7.0) nuclear@10: ); nuclear@10: uniform vec3 light_color[3] = vec3[3]( nuclear@9: vec3(0.9, 0.7, 0.68), nuclear@9: vec3(0.5, 0.6, 0.9), nuclear@9: vec3(0.3, 0.3, 0.3) nuclear@10: ); nuclear@9: nuclear@9: const vec3 ambient = vec3(0.1, 0.1, 0.1); nuclear@9: const vec3 vdir = vec3(0.0, 0.0, 1.0); nuclear@9: const float dimmer = 0.7; nuclear@9: nuclear@4: void main() nuclear@4: { nuclear@8: vec3 tc = gl_TexCoord[0].xyz; nuclear@8: float max_manh_dist = max(tc.x, max(tc.y, tc.z)); nuclear@8: float min_manh_dist = min(tc.x, min(tc.y, tc.z)); nuclear@8: float border = step(0.0, min_manh_dist) * (1.0 - step(1.0, max_manh_dist)); nuclear@8: nuclear@4: vec4 voxel = texture3D(vol_tex, gl_TexCoord[0].xyz); nuclear@4: vec4 color = texture1D(xfer_tex, voxel.a); nuclear@4: nuclear@8: float alpha = color.a * border; nuclear@8: if(alpha < 0.001) discard; nuclear@8: nuclear@9: vec3 norm = normalize(voxel.rgb * 2.0 - 1.0); nuclear@9: nuclear@9: vec3 diffuse = vec3(0.0, 0.0, 0.0); nuclear@9: vec3 specular = vec3(0.0, 0.0, 0.0); nuclear@9: nuclear@9: for(int i=0; i<3; i++) { nuclear@9: vec3 ldir = normalize(light_dir[i]); nuclear@9: vec3 hdir = normalize(vdir + ldir); nuclear@9: nuclear@9: float ndotl = max(dot(norm, ldir), 0.0); nuclear@9: float ndoth = max(dot(norm, hdir), 0.0); nuclear@9: nuclear@9: diffuse += light_color[i] * color.rgb * ndotl; nuclear@9: specular += light_color[i] * vec3(0.6, 0.6, 0.6) * pow(ndoth, 50.0); nuclear@9: } nuclear@9: nuclear@9: gl_FragColor.rgb = ambient + (diffuse + specular) * dimmer; nuclear@8: gl_FragColor.a = alpha; nuclear@4: }