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 Stockner <lukas.stockner@freenet.de>2015-08-06 22:04:43 +0300
committerLukas Stockner <lukas.stockner@freenet.de>2015-11-18 22:50:06 +0300
commit8dea06565f11f706195c89dcfcd7867b887a0ff7 (patch)
tree4c82f0c3aa12d967d0c49ec57f350cba43c6db81 /intern
parent24a387d6ff515abcf47d7ad61d4faa9a589bd1a9 (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.py1
-rw-r--r--intern/cycles/kernel/kernel_types.h2
-rw-r--r--intern/cycles/render/film.cpp13
-rw-r--r--intern/cycles/render/film.h3
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 {