summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrian Paul <brian.paul@tungstengraphics.com>2008-08-11 16:07:40 -0600
committerBrian Paul <brian.paul@tungstengraphics.com>2008-08-11 16:07:40 -0600
commit90ffd2736c2edc967a5a72d7afeebccf8b791692 (patch)
tree740264213ee23837a0089e36533e2dcb186a28af
parent0423a39239c57575708a2698c726cd57791bc357 (diff)
mesa: glsl: fix bugs in refract() functions, plus minor optimization
-rw-r--r--src/mesa/shader/slang/library/slang_common_builtin.gc26
1 files changed, 15 insertions, 11 deletions
diff --git a/src/mesa/shader/slang/library/slang_common_builtin.gc b/src/mesa/shader/slang/library/slang_common_builtin.gc
index 9f2a4bdd07..3182841b1f 100644
--- a/src/mesa/shader/slang/library/slang_common_builtin.gc
+++ b/src/mesa/shader/slang/library/slang_common_builtin.gc
@@ -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;
}