Permalink
Join GitHub today
GitHub is home to over 40 million developers working together to host and review code, manage projects, and build software together.
Sign up| #[macro_use] | |
| extern crate glium; | |
| mod support; | |
| #[allow(unused_imports)] | |
| use glium::{glutin, Surface}; | |
| use glium::index::PrimitiveType; | |
| fn main() { | |
| let event_loop = glutin::event_loop::EventLoop::new(); | |
| let wb = glutin::window::WindowBuilder::new(); | |
| let cb = glutin::ContextBuilder::new(); | |
| let display = glium::Display::new(wb, cb, &event_loop).unwrap(); | |
| // building the vertex buffer, which contains all the vertices that we will draw | |
| let vertex_buffer = { | |
| #[derive(Copy, Clone)] | |
| struct Vertex { | |
| position: [f32; 2], | |
| color: [f32; 3], | |
| } | |
| implement_vertex!(Vertex, position, color); | |
| glium::VertexBuffer::new(&display, | |
| &[ | |
| Vertex { position: [-0.5, -0.5], color: [0.0, 1.0, 0.0] }, | |
| Vertex { position: [ 0.0, 0.5], color: [0.0, 0.0, 1.0] }, | |
| Vertex { position: [ 0.5, -0.5], color: [1.0, 0.0, 0.0] }, | |
| ] | |
| ).unwrap() | |
| }; | |
| // building the index buffer | |
| let index_buffer = glium::IndexBuffer::new(&display, PrimitiveType::TrianglesList, | |
| &[0u16, 1, 2]).unwrap(); | |
| // compiling shaders and linking them together | |
| let program = program!(&display, | |
| 140 => { | |
| vertex: " | |
| #version 140 | |
| uniform mat4 matrix; | |
| in vec2 position; | |
| in vec3 color; | |
| out vec3 vColor; | |
| void main() { | |
| gl_Position = vec4(position, 0.0, 1.0) * matrix; | |
| vColor = color; | |
| } | |
| ", | |
| fragment: " | |
| #version 140 | |
| in vec3 vColor; | |
| out vec4 f_color; | |
| void main() { | |
| f_color = vec4(vColor, 1.0); | |
| } | |
| " | |
| }, | |
| 110 => { | |
| vertex: " | |
| #version 110 | |
| uniform mat4 matrix; | |
| attribute vec2 position; | |
| attribute vec3 color; | |
| varying vec3 vColor; | |
| void main() { | |
| gl_Position = vec4(position, 0.0, 1.0) * matrix; | |
| vColor = color; | |
| } | |
| ", | |
| fragment: " | |
| #version 110 | |
| varying vec3 vColor; | |
| void main() { | |
| gl_FragColor = vec4(vColor, 1.0); | |
| } | |
| ", | |
| }, | |
| 100 => { | |
| vertex: " | |
| #version 100 | |
| uniform lowp mat4 matrix; | |
| attribute lowp vec2 position; | |
| attribute lowp vec3 color; | |
| varying lowp vec3 vColor; | |
| void main() { | |
| gl_Position = vec4(position, 0.0, 1.0) * matrix; | |
| vColor = color; | |
| } | |
| ", | |
| fragment: " | |
| #version 100 | |
| varying lowp vec3 vColor; | |
| void main() { | |
| gl_FragColor = vec4(vColor, 1.0); | |
| } | |
| ", | |
| }, | |
| ).unwrap(); | |
| // Here we draw the black background and triangle to the screen using the previously | |
| // initialised resources. | |
| // | |
| // In this case we use a closure for simplicity, however keep in mind that most serious | |
| // applications should probably use a function that takes the resources as an argument. | |
| let draw = move || { | |
| // building the uniforms | |
| let uniforms = uniform! { | |
| matrix: [ | |
| [1.0, 0.0, 0.0, 0.0], | |
| [0.0, 1.0, 0.0, 0.0], | |
| [0.0, 0.0, 1.0, 0.0], | |
| [0.0, 0.0, 0.0, 1.0f32] | |
| ] | |
| }; | |
| // drawing a frame | |
| let mut target = display.draw(); | |
| target.clear_color(0.0, 0.0, 0.0, 0.0); | |
| target.draw(&vertex_buffer, &index_buffer, &program, &uniforms, &Default::default()).unwrap(); | |
| target.finish().unwrap(); | |
| }; | |
| // Draw the triangle to the screen. | |
| draw(); | |
| // the main loop | |
| event_loop.run(move |event, _, control_flow| { | |
| *control_flow = match event { | |
| glutin::event::Event::WindowEvent { event, .. } => match event { | |
| // Break from the main loop when the window is closed. | |
| glutin::event::WindowEvent::CloseRequested => glutin::event_loop::ControlFlow::Exit, | |
| // Redraw the triangle when the window is resized. | |
| glutin::event::WindowEvent::Resized(..) => { | |
| draw(); | |
| glutin::event_loop::ControlFlow::Poll | |
| }, | |
| _ => glutin::event_loop::ControlFlow::Poll, | |
| }, | |
| _ => glutin::event_loop::ControlFlow::Poll, | |
| }; | |
| }); | |
| } |