Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/intern
diff options
context:
space:
mode:
authorLukas Toenne <lukas.toenne@googlemail.com>2012-09-16 17:17:39 +0400
committerLukas Toenne <lukas.toenne@googlemail.com>2012-09-16 17:17:39 +0400
commitacb2c7e0d17aa345e867c1ef55961e87bea14c53 (patch)
tree2d1e581a582dd11d71a04b5f78f3b7e8e2432077 /intern
parent7f1cfbfff5adb25e0b7610451566b8cc24b3211a (diff)
OSL Fix for fireflies in velvet bsdf, ported over from SVM fix in r41738.
Diffstat (limited to 'intern')
-rw-r--r--intern/cycles/kernel/osl/bsdf_ashikhmin_velvet.cpp41
1 files changed, 24 insertions, 17 deletions
diff --git a/intern/cycles/kernel/osl/bsdf_ashikhmin_velvet.cpp b/intern/cycles/kernel/osl/bsdf_ashikhmin_velvet.cpp
index cb6be6959f5..2c545ca55e7 100644
--- a/intern/cycles/kernel/osl/bsdf_ashikhmin_velvet.cpp
+++ b/intern/cycles/kernel/osl/bsdf_ashikhmin_velvet.cpp
@@ -90,8 +90,11 @@ public:
float cosNH = m_N.dot(H);
float cosHO = fabsf(omega_out.dot(H));
+ if(!(fabsf(cosNH) < 1.0f-1e-5f && cosHO > 1e-5f))
+ return Color3(0, 0, 0);
+
float cosNHdivHO = cosNH / cosHO;
- cosNHdivHO = max(cosNHdivHO, 0.00001f);
+ cosNHdivHO = max(cosNHdivHO, 1e-5f);
float fac1 = 2 * fabsf(cosNHdivHO * cosNO);
float fac2 = 2 * fabsf(cosNHdivHO * cosNI);
@@ -134,28 +137,32 @@ public:
float cosNH = m_N.dot(H);
float cosHO = fabsf(omega_out.dot(H));
- float cosNHdivHO = cosNH / cosHO;
- cosNHdivHO = max(cosNHdivHO, 0.00001f);
+ if(fabsf(cosNO) > 1e-5f && fabsf(cosNH) < 1.0f-1e-5f && cosHO > 1e-5f) {
+ float cosNHdivHO = cosNH / cosHO;
+ cosNHdivHO = max(cosNHdivHO, 1e-5f);
- float fac1 = 2 * fabsf(cosNHdivHO * cosNO);
- float fac2 = 2 * fabsf(cosNHdivHO * cosNI);
+ float fac1 = 2 * fabsf(cosNHdivHO * cosNO);
+ float fac2 = 2 * fabsf(cosNHdivHO * cosNI);
- float sinNH2 = 1 - cosNH * cosNH;
- float sinNH4 = sinNH2 * sinNH2;
- float cotangent2 = (cosNH * cosNH) / sinNH2;
+ float sinNH2 = 1 - cosNH * cosNH;
+ float sinNH4 = sinNH2 * sinNH2;
+ float cotangent2 = (cosNH * cosNH) / sinNH2;
- float D = expf(-cotangent2 * m_invsigma2) * m_invsigma2 * float(M_1_PI) / sinNH4;
- float G = min(1.0f, min(fac1, fac2)); // TODO: derive G from D analytically
+ float D = expf(-cotangent2 * m_invsigma2) * m_invsigma2 * float(M_1_PI) / sinNH4;
+ float G = min(1.0f, min(fac1, fac2)); // TODO: derive G from D analytically
- float power = 0.25f * (D * G) / cosNO;
+ float power = 0.25f * (D * G) / cosNO;
- eval.setValue(power, power, power);
+ eval.setValue(power, power, power);
- // TODO: find a better approximation for the retroreflective bounce
- domega_in_dx = (2 * m_N.dot(domega_out_dx)) * m_N - domega_out_dx;
- domega_in_dy = (2 * m_N.dot(domega_out_dy)) * m_N - domega_out_dy;
- domega_in_dx *= 125;
- domega_in_dy *= 125;
+ // TODO: find a better approximation for the retroreflective bounce
+ domega_in_dx = (2 * m_N.dot(domega_out_dx)) * m_N - domega_out_dx;
+ domega_in_dy = (2 * m_N.dot(domega_out_dy)) * m_N - domega_out_dy;
+ domega_in_dx *= 125;
+ domega_in_dy *= 125;
+ }
+ else
+ pdf = 0;
}
else
pdf = 0;