CGII/framework/shader/cgv_gl/glsl/sphere_base.glfs
2018-05-17 16:01:02 +02:00

36 lines
953 B
Plaintext

#version 150 compatibility
in SphereData {
vec2 q_tilde;
float inv_e;
vec3 nml_e_eye;
vec3 nml_v_eye;
vec2 zw_e_clip;
vec2 zw_v_clip;
vec3 v_eye;
} Fin;
bool compute_sphere_intersection(out float depth, out vec3 p_eye, out vec3 n_eye, in bool show_backside = false)
{
// check for intersection
float q_tilde_squared_length = dot(Fin.q_tilde, Fin.q_tilde);
if (q_tilde_squared_length > 1.0)
return false;
// compute ray parameter
float beta = Fin.inv_e*sqrt(1.0 - q_tilde_squared_length);
float lambda = show_backside ? 1.0 / (1.0 - beta) : 1.0 / (1.0 + beta);
// depth correction
vec2 zw = Fin.zw_e_clip + lambda * Fin.zw_v_clip;
float z_clip = zw.x / zw.y;
depth = 0.5*(z_clip + 1.0); // transform from [-1,1] to [0,1]
// compute sphere position and normal in eye coordinates
p_eye = lambda*Fin.v_eye;
n_eye = normalize(Fin.nml_e_eye + lambda * Fin.nml_v_eye);
if (show_backside) {
n_eye = -n_eye;
}
return true;
}