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
diff options
context:
space:
mode:
authorSergey Sharybin <sergey.vfx@gmail.com>2014-10-22 20:08:17 +0400
committerSergey Sharybin <sergey.vfx@gmail.com>2014-10-22 20:11:40 +0400
commit742911314322e5dae3a07469d0ca53b61427f978 (patch)
tree2ce31e7c3c69ade2fcd19bfce55e37f3b6a2b0d2 /intern/cycles/render/film.cpp
parente2c04a8bf0d71a68c9ae8fa26c9deecd3dae347f (diff)
Cycles: Implement Mitchell-Netravali pixel filter
It's the same filter which is used by default by Blender Internal renderer and it gives crispier edges than gaussian filter. Default filter for Cycles is unchanged because it's unclear if new filter gives more noise or not. After some further real production tests we can consider making Mitchell filter default for Cycles as well.
Diffstat (limited to 'intern/cycles/render/film.cpp')
-rw-r--r--intern/cycles/render/film.cpp26
1 files changed, 26 insertions, 0 deletions
diff --git a/intern/cycles/render/film.cpp b/intern/cycles/render/film.cpp
index 19f959d4ea1..76a92d3d704 100644
--- a/intern/cycles/render/film.cpp
+++ b/intern/cycles/render/film.cpp
@@ -198,6 +198,29 @@ static float filter_func_gaussian(float v, float width)
return expf(-2.0f*v*v);
}
+static float filter_func_mitchell(float v, float width)
+{
+ (void)width; /* Ignored. */
+
+ /* B = 1, C = 0 - cubic B-spline */
+ /* B = 1/3, C = 1/3 - recommended */
+ /* B = 0, C = 1/2 - Catmull-Rom spline */
+ const float B = 1.0f / 3.0f;
+ const float C = 1.0f / 3.0f;
+
+ const float ax = fabsf(v);
+ if (ax < 1.0f) {
+ return ((12.0f - 9.0f * B - 6 * C) * ax * ax * ax +
+ (-18.0f + 12.0f * B + 6.0f * C) * ax * ax +
+ (6.0f - 2.0f * B)) / 6.0f;
+ } else if ((ax >= 1.0f) && (ax < 2.0f)) {
+ return ((-B - 6.0f * C) * ax * ax * ax +
+ (6.0f * B + 30.0f * C) * ax * ax + (-12.0f * B - 48.0f * C) *
+ ax + (8.0f * B + 24.0f * C)) / 6.0f;
+ }
+ return 0.0f;
+}
+
static vector<float> filter_table(FilterType type, float width)
{
const int filter_table_size = FILTER_TABLE_SIZE-1;
@@ -213,6 +236,9 @@ static vector<float> filter_table(FilterType type, float width)
case FILTER_GAUSSIAN:
filter_func = filter_func_gaussian;
break;
+ case FILTER_MITCHELL:
+ filter_func = filter_func_mitchell;
+ break;
default:
assert(0);
}