1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
use super::{ProgramSettings, GLSL_VERSION, default_settings}; use rin_gl::{self as gl, uniforms, Renderer3d}; use rin_util::{Result, Error, LogErr}; use color::consts::BLACK; use std::rc::Rc; use rin_graphics::Vertex2DTex; #[cfg(glsl_debug)] use rin_util::AutoLoader; pub struct Fxaa { fbo: gl::Fbo, program: gl::Program, #[cfg(glsl_debug)] program_loader: AutoLoader<gl::Program>, fullscreen_quad: Rc<gl::SimpleVao<Vertex2DTex>>, } fn program_settings() -> ProgramSettings { ProgramSettings{ version: GLSL_VERSION, precision: gl::program::ShaderPrecision::High, extensions: vec![], defines: vec![("FXAA_GLSL_130".to_owned(), "1".to_owned())], shaders: vec![ (gl::VERTEX_SHADER, shader!("shaders/full_quad.vs.glsl")), (gl::FRAGMENT_SHADER, shader!("shaders/fxaa.fs.glsl")), ], .. default_settings() } } impl Fxaa { pub fn new(gl: &gl::Renderer, w: u32, h: u32, format: gl::fbo::ColorFormat, fullscreen_quad: Rc<gl::SimpleVao<Vertex2DTex>>) -> Result<Fxaa> { let fbo = super::fbo(gl, w, h, format) .map_err(|err| Error::with_cause("Couldn't create fxaa fbo", err))?; #[cfg(glsl_debug)] let mut program_loader = gl.new_auto_program(program_settings()); #[cfg(glsl_debug)] let program = program_loader.load().log_err("")?; #[cfg(not(glsl_debug))] let program = gl.new_program().from_settings(program_settings()) .log_err("") .map_err(|err| Error::with_cause("Error loading fxaa shader", err))?; Ok(Fxaa{ fbo, program, #[cfg(glsl_debug)] program_loader, fullscreen_quad }) } #[cfg(glsl_debug)] pub fn update(&mut self){ match self.program_loader.update(){ Ok(Some(program)) => { self.program = program; println!("fxaa program reloaded correctly"); } Err(err) => { println!("{}", err); } _ => {} } } pub fn texture(&self) -> &gl::Texture{ self.fbo.color_tex(0).unwrap() } pub fn process(&self, gl: &gl::Renderer, tex: &gl::Texture) -> &gl::Texture { #[cfg(gl_debug_groups)] let _debug_group = gl.new_debug_group(0, "FXAA"); let uniforms = uniforms!{ tex0: tex, width: self.fbo.width() as f32, height: self.fbo.height() as f32, }; let gl = gl.with_fbo(&self.fbo); gl.clear_color(&BLACK); gl.draw_vao(&*self.fullscreen_quad, &self.program, &uniforms); self.fbo.color_tex(0).unwrap() } }