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
use crate::core::*; pub struct ImageEffect { gl: Gl, program: Program, positions: VertexBuffer, uvs: VertexBuffer } impl ImageEffect { pub fn new(gl: &Gl, fragment_shader: &str) -> Result<Self, Error> { let program = program::Program::from_source(&gl, "in vec3 position; in vec2 uv_coordinate; out vec2 uv; void main() { uv = uv_coordinate; gl_Position = vec4(position, 1.0); }", fragment_shader)?; let positions = vec![ -3.0, -1.0, 0.0, 3.0, -1.0, 0.0, 0.0, 2.0, 0.0 ]; let uvs = vec![ -1.0, 0.0, 2.0, 0.0, 0.5, 1.5 ]; let positions = VertexBuffer::new_with_static_f32(&gl, &positions).unwrap(); let uvs = VertexBuffer::new_with_static_f32(&gl, &uvs).unwrap(); Ok(Self {gl: gl.clone(), program, positions, uvs}) } pub fn program(&self) -> &Program { &self.program } pub fn apply(&self) { state::cull(&self.gl,state::CullType::Back); self.program.use_attribute_vec3_float(&self.positions, "position").unwrap(); self.program.use_attribute_vec2_float(&self.uvs, "uv_coordinate").unwrap(); self.program.draw_arrays(3); } }