Expand description
All filter implementations are derived from an abstract Filter class, which provides the interface for the functions used in filtering.
- BoxFilter
- GaussianFilter
- MitchellFilter
- LanczosSincFilter
- TriangleFilter
Box Filter
One of the most commonly used filters in graphics is the box filter. The box filter equally weights all samples within a square region of the image. Although computational efficient, it’s just about the worst filter possible.
use rs_pbrt::core::pbrt::Float;
use rs_pbrt::filters::boxfilter::BoxFilter;
use rs_pbrt::core::geometry::Vector2f;
fn main() {
let xw: Float = 0.5;
let yw: Float = 0.5;
let box_filter = BoxFilter {
radius: Vector2f { x: xw, y: yw },
inv_radius: Vector2f {
x: 1.0 / xw,
y: 1.0 / yw,
},
};
println!("box_filter = {:?}", box_filter);
}
Gaussian Filter
Unlike the box and triangle filters, the Gaussian filter gives a reasonably good result in practice. The Gaussian filter does tend to cause slight blurring of the final image compared to some of the other filters, but this blurring can actually help mask any remaining aliasing in the image.
use rs_pbrt::core::pbrt::Float;
use rs_pbrt::filters::gaussian::GaussianFilter;
use rs_pbrt::core::geometry::Vector2f;
fn main() {
let xw: Float = 2.0;
let yw: Float = 2.0;
let alpha: Float = 2.0;
let exp_x: Float = (-alpha * xw * xw).exp();
let exp_y: Float = (-alpha * yw * yw).exp();
let gaussian_filter = GaussianFilter {
alpha: alpha,
exp_x: exp_x,
exp_y: exp_y,
radius: Vector2f { x: xw, y: yw },
inv_radius: Vector2f {
x: 1.0 / xw,
y: 1.0 / yw,
},
};
println!("gaussian_filter = {:?}", gaussian_filter);
}
MitchellFilter
use rs_pbrt::core::geometry::Vector2f;
use rs_pbrt::core::pbrt::Float;
use rs_pbrt::filters::mitchell::MitchellNetravali;
fn main() {
let xwidth: Float = 2.0;
let ywidth: Float = 2.0;
let b: Float = 1.0 / 3.0;
let c: Float = 1.0 / 3.0;
let mitchell_filter = MitchellNetravali::new(xwidth, ywidth, b, c);
println!("mitchell_filter = {:?}", mitchell_filter);
}
LanczosSincFilter
use rs_pbrt::core::geometry::Vector2f;
use rs_pbrt::core::pbrt::Float;
use rs_pbrt::filters::sinc::LanczosSincFilter;
fn main() {
let xw: Float = 4.0;
let yw: Float = 4.0;
let radius: Vector2f = Vector2f { x: xw, y: yw };
let tau: Float = 3.0;
let sinc_filter = LanczosSincFilter::new(radius, tau);
println!("sinc_filter = {:?}", sinc_filter);
}
TriangleFilter
use rs_pbrt::core::geometry::Vector2f;
use rs_pbrt::core::pbrt::Float;
use rs_pbrt::filters::triangle::TriangleFilter;
fn main() {
let xw: Float = 2.0;
let yw: Float = 2.0;
let triangle_filter = TriangleFilter {
radius: Vector2f { x: xw, y: yw },
inv_radius: Vector2f {
x: 1.0 / xw,
y: 1.0 / yw,
},
};
println!("triangle_filter = {:?}", triangle_filter);
}