mesa: glsl: fix bugs in refract() functions, plus minor optimization
authorBrian Paul <brian.paul@tungstengraphics.com>
Mon, 11 Aug 2008 22:07:40 +0000 (16:07 -0600)
committerBrian Paul <brian.paul@tungstengraphics.com>
Mon, 11 Aug 2008 22:07:40 +0000 (16:07 -0600)
src/mesa/shader/slang/library/slang_common_builtin.gc

index 9f2a4bdd0754c86ebf8006a46a665e4604409ad6..3182841b1f56bbdf0488fc6df85ba076df6a4758 100644 (file)
@@ -1277,34 +1277,38 @@ vec4 reflect(const vec4 I, const vec4 N)
 
 float refract(const float I, const float N, const float eta)
 {
-   float k = 1.0 - eta * eta * (1.0 - dot(N, I) * dot(N, I));
+   float n_dot_i = dot(N, I);
+   float k = 1.0 - eta * eta * (1.0 - n_dot_i * n_dot_i);
    if (k < 0.0)
        return 0.0;
-   return eta * I - (eta * dot(N, I) + sqrt(k)) * N;
+   return eta * I - (eta * n_dot_i + sqrt(k)) * N;
 }
 
 vec2 refract(const vec2 I, const vec2 N, const float eta)
 {
-   float k = 1.0 - eta * eta * (1.0 - dot(N, I) * dot(N, I));
+   float n_dot_i = dot(N, I);
+   float k = 1.0 - eta * eta * (1.0 - n_dot_i * n_dot_i);
    if (k < 0.0)
-      return 0.0;
-   return eta * I - (eta * dot(N, I) + sqrt(k)) * N;
+      return vec2(0.0);
+   return eta * I - (eta * n_dot_i + sqrt(k)) * N;
 }
 
 vec3 refract(const vec3 I, const vec3 N, const float eta)
 {
-   float k = 1.0 - eta * eta * (1.0 - dot(N, I) * dot(N, I));
+   float n_dot_i = dot(N, I);
+   float k = 1.0 - eta * eta * (1.0 - n_dot_i * n_dot_i);
    if (k < 0.0)
-      return 0.0;
-   return eta * I - (eta * dot(N, I) + sqrt(k)) * N;
+      return vec3(0.0);
+   return eta * I - (eta * n_dot_i + sqrt(k)) * N;
 }
 
 vec4 refract(const vec4 I, const vec4 N, const float eta)
 {
-   float k = 1.0 - eta * eta * (1.0 - dot(N, I) * dot(N, I));
+   float n_dot_i = dot(N, I);
+   float k = 1.0 - eta * eta * (1.0 - n_dot_i * n_dot_i);
    if (k < 0.0)
-      return 0.0;
-   return eta * I - (eta * dot(N, I) + sqrt(k)) * N;
+      return vec4(0.0);
+   return eta * I - (eta * n_dot_i + sqrt(k)) * N;
 }