diff options
author | Lukas Stockner <lukas.stockner@freenet.de> | 2015-08-06 22:04:43 +0300 |
---|---|---|
committer | Lukas Stockner <lukas.stockner@freenet.de> | 2015-11-18 22:50:06 +0300 |
commit | 8dea06565f11f706195c89dcfcd7867b887a0ff7 (patch) | |
tree | 4c82f0c3aa12d967d0c49ec57f350cba43c6db81 /intern | |
parent | 24a387d6ff515abcf47d7ad61d4faa9a589bd1a9 (diff) |
Cycles: Add Blackman-Harris filter, fix Gaussian filter
This commit adds the Blackman-Harris windows function as a pixel filter to Cycles. On some cases, such as wireframes or high-frequency textures,
Blackman-Harris can give subtle but noticable improvements over the Gaussian window.
Also, the gaussian window was truncated too early, which degraded quality a bit, therefore the evaluation region is now three times as wide.
To avoid artifacts caused by the wider curve, the filter table size is increased to 1024.
Reviewers: #cycles
Differential Revision: https://developer.blender.org/D1453
Diffstat (limited to 'intern')
-rw-r--r-- | intern/cycles/blender/addon/properties.py | 1 | ||||
-rw-r--r-- | intern/cycles/kernel/kernel_types.h | 2 | ||||
-rw-r--r-- | intern/cycles/render/film.cpp | 13 | ||||
-rw-r--r-- | intern/cycles/render/film.h | 3 |
4 files changed, 16 insertions, 3 deletions
diff --git a/intern/cycles/blender/addon/properties.py b/intern/cycles/blender/addon/properties.py index c3139831ca2..cbd1a8b1922 100644 --- a/intern/cycles/blender/addon/properties.py +++ b/intern/cycles/blender/addon/properties.py @@ -54,6 +54,7 @@ enum_bvh_types = ( enum_filter_types = ( ('BOX', "Box", "Box filter"), ('GAUSSIAN', "Gaussian", "Gaussian filter"), + ('BLACKMAN_HARRIS', "Blackman-Harris", "Blackman-Harris filter"), ) enum_aperture_types = ( diff --git a/intern/cycles/kernel/kernel_types.h b/intern/cycles/kernel/kernel_types.h index 1d71e6435db..75a9e213d4f 100644 --- a/intern/cycles/kernel/kernel_types.h +++ b/intern/cycles/kernel/kernel_types.h @@ -37,7 +37,7 @@ CCL_NAMESPACE_BEGIN #define OBJECT_SIZE 11 #define OBJECT_VECTOR_SIZE 6 #define LIGHT_SIZE 5 -#define FILTER_TABLE_SIZE 256 +#define FILTER_TABLE_SIZE 1024 #define RAMP_TABLE_SIZE 256 #define SHUTTER_TABLE_SIZE 256 #define PARTICLE_SIZE 5 diff --git a/intern/cycles/render/film.cpp b/intern/cycles/render/film.cpp index ce3f5b180ff..abdd1c2cc8a 100644 --- a/intern/cycles/render/film.cpp +++ b/intern/cycles/render/film.cpp @@ -209,10 +209,16 @@ static float filter_func_box(float /*v*/, float /*width*/) static float filter_func_gaussian(float v, float width) { - v *= 2.0f/width; + v *= 6.0f/width; return expf(-2.0f*v*v); } +static float filter_func_blackman_harris(float v, float width) +{ + v = M_2PI_F * (v / width + 0.5f); + return 0.35875f - 0.48829f*cosf(v) + 0.14128f*cosf(2.0f*v) - 0.01168f*cosf(3.0f*v); +} + static vector<float> filter_table(FilterType type, float width) { vector<float> filter_table(FILTER_TABLE_SIZE); @@ -224,6 +230,11 @@ static vector<float> filter_table(FilterType type, float width) break; case FILTER_GAUSSIAN: filter_func = filter_func_gaussian; + width *= 3.0f; + break; + case FILTER_BLACKMAN_HARRIS: + filter_func = filter_func_blackman_harris; + width *= 2.0f; break; default: assert(0); diff --git a/intern/cycles/render/film.h b/intern/cycles/render/film.h index e2cd63cc2ed..0fde9287969 100644 --- a/intern/cycles/render/film.h +++ b/intern/cycles/render/film.h @@ -30,7 +30,8 @@ class Scene; typedef enum FilterType { FILTER_BOX, - FILTER_GAUSSIAN + FILTER_GAUSSIAN, + FILTER_BLACKMAN_HARRIS } FilterType; class Pass { |