forked from bartvdbraak/blender
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
This commit is contained in:
parent
24a387d6ff
commit
8dea06565f
@ -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 = (
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
@ -30,7 +30,8 @@ class Scene;
|
||||
|
||||
typedef enum FilterType {
|
||||
FILTER_BOX,
|
||||
FILTER_GAUSSIAN
|
||||
FILTER_GAUSSIAN,
|
||||
FILTER_BLACKMAN_HARRIS
|
||||
} FilterType;
|
||||
|
||||
class Pass {
|
||||
|
Loading…
Reference in New Issue
Block a user