use crate::{
core::{algebra::Vector2, math::Rect, sstorage::ImmutableString},
graphics::{error::FrameworkError, framebuffer::GpuFrameBuffer, gpu_texture::GpuTexture},
renderer::{
cache::{
shader::{binding, property, PropertyGroup, RenderMaterial},
uniform::UniformBufferCache,
},
make_viewport_matrix,
resources::RendererResources,
RenderPassStatistics,
},
};
use fyrox_graphics::server::GraphicsServer;
#[derive(Default)]
pub struct FxaaRenderer {}
impl FxaaRenderer {
pub(crate) fn render(
&self,
server: &dyn GraphicsServer,
viewport: Rect<i32>,
frame_texture: &GpuTexture,
frame_buffer: &GpuFrameBuffer,
uniform_buffer_cache: &mut UniformBufferCache,
renderer_resources: &RendererResources,
) -> Result<RenderPassStatistics, FrameworkError> {
let _debug_scope = server.begin_scope("FXAA");
let mut statistics = RenderPassStatistics::default();
let frame_matrix = make_viewport_matrix(viewport);
let inv_screen_size = Vector2::new(1.0 / viewport.w() as f32, 1.0 / viewport.h() as f32);
let properties = PropertyGroup::from([
property("worldViewProjection", &frame_matrix),
property("inverseScreenSize", &inv_screen_size),
]);
let material = RenderMaterial::from([
binding(
"screenTexture",
(frame_texture, &renderer_resources.nearest_clamp_sampler),
),
binding("properties", &properties),
]);
statistics += renderer_resources.shaders.fxaa.run_pass(
1,
&ImmutableString::new("Primary"),
frame_buffer,
&renderer_resources.quad,
viewport,
&material,
uniform_buffer_cache,
Default::default(),
None,
)?;
Ok(statistics)
}
}