[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [47381] trunk/blender/intern/cycles/kernel /osl/bsdf_oren_nayar.cpp: Cycles / OSL:
Thomas Dinges
blender at dingto.org
Sun Jun 3 20:05:01 CEST 2012
Revision: 47381
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=47381
Author: dingto
Date: 2012-06-03 18:04:52 +0000 (Sun, 03 Jun 2012)
Log Message:
-----------
Cycles / OSL:
* Update the Oren Nayar shader to incorporate updates / fixes from r41968 and r44330.
Revision Links:
--------------
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=41968
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=44330
Modified Paths:
--------------
trunk/blender/intern/cycles/kernel/osl/bsdf_oren_nayar.cpp
Modified: trunk/blender/intern/cycles/kernel/osl/bsdf_oren_nayar.cpp
===================================================================
--- trunk/blender/intern/cycles/kernel/osl/bsdf_oren_nayar.cpp 2012-06-03 17:16:50 UTC (rev 47380)
+++ trunk/blender/intern/cycles/kernel/osl/bsdf_oren_nayar.cpp 2012-06-03 18:04:52 UTC (rev 47381)
@@ -16,31 +16,6 @@
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
-/*
- * An implementation of Oren-Nayar reflectance model, public domain
- * http://www1.cs.columbia.edu/CAVE/publications/pdfs/Oren_SIGGRAPH94.pdf
- *
- * NOTE:
- * BSDF = A + B * cos() * sin() * tan()
- *
- * The parameter sigma means different from original.
- * A and B are calculated by the following formula:
- * 0 <= sigma <= 1
- * A = 1 / ((1 + sigma / 2) * pi);
- * B = sigma / ((1 + sigma / 2) * pi);
- *
- * This formula is derived as following:
- *
- * 0. Normalize A-term and B-term of BSDF *individually*.
- * B-term is normalized at maximum point: dot(L, N) = 0.
- * A = (1/pi) * A'
- * B = (2/pi) * B'
- *
- * 1. Solve the following equation:
- * A' + B' = 1
- * B / A = sigma
- */
-
#include <OpenImageIO/fmath.h>
#include <OSL/genclosure.h>
#include "osl_closures.h"
@@ -60,8 +35,11 @@
void setup() {
m_sigma = clamp(m_sigma, 0.0f, 1.0f);
- m_a = 1.0f / ((1.0f + 0.5f * m_sigma) * M_PI);
- m_b = m_sigma / ((1.0f + 0.5f * m_sigma) * M_PI);
+
+ float div = 1.0f / (M_PI + ((3.0f * M_PI - 4.0f) / 6.0f) * m_sigma);
+
+ m_a = 1.0f * div;
+ m_b = m_sigma * div;
}
bool mergeable(const ClosurePrimitive* other) const {
@@ -137,27 +115,12 @@
float get_intensity(Vec3 const& n, Vec3 const& v, Vec3 const& l) const {
float nl = max(n.dot(l), 0.0f);
float nv = max(n.dot(v), 0.0f);
-
- Vec3 al = l - nl * n;
- al.normalize();
- Vec3 av = v - nv * n;
- av.normalize();
- float t = max(al.dot(av), 0.0f);
-
- float cos_a, cos_b;
- if (nl < nv) {
- cos_a = nl;
- cos_b = nv;
+ float t = l.dot(v) - nl * nv;
+
+ if(t > 0.0f) {
+ t /= max(nl, vl) + 1e-8f;
}
- else {
- cos_a = nv;
- cos_b = nl;
- }
-
- float sin_a = sqrtf(1.0f - cos_a * cos_a);
- float tan_b = sqrtf(1.0f - cos_b * cos_b) / (cos_b + FLT_MIN);
-
- return nl * (m_a + m_b * t * sin_a * tan_b);
+ return nl * (m_a + m_b * t);
}
};
More information about the Bf-blender-cvs
mailing list