#[macro_use]
extern crate glium;
mod support;
use glium::index::PrimitiveType;
use glium::{Display, Surface};
use glutin::surface::WindowSurface;
use support::{ApplicationContext, State};
#[derive(Copy, Clone)]
struct Vertex {
position: [f32; 2],
color: [f32; 3],
}
implement_vertex!(Vertex, position, color);
struct Application {
pub vertex_buffer: glium::VertexBuffer<Vertex>,
pub index_buffer: glium::IndexBuffer<u16>,
pub program: glium::Program,
}
impl ApplicationContext for Application {
const WINDOW_TITLE:&'static str = "Glium screenshot example";
fn new(display: &Display<WindowSurface>) -> Self {
let vertex_buffer = {
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()
};
let index_buffer =
glium::IndexBuffer::new(display, PrimitiveType::TrianglesList, &[0u16, 1, 2]).unwrap();
let program = program!(display,
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();
Self {
vertex_buffer,
index_buffer,
program,
}
}
fn draw_frame(&mut self, display: &Display<WindowSurface>) {
let mut frame = display.draw();
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]
]
};
frame.clear_color(0.0, 0.0, 0.0, 0.0);
frame
.draw(
&self.vertex_buffer,
&self.index_buffer,
&self.program,
&uniforms,
&Default::default(),
)
.unwrap();
frame.finish().unwrap();
let image: glium::texture::RawImage2d<'_, u8> = display.read_front_buffer().unwrap();
let image = image::ImageBuffer::from_raw(image.width, image.height, image.data.into_owned()).unwrap();
let image = image::DynamicImage::ImageRgba8(image).flipv();
image.save("glium-example-screenshot.png").unwrap();
}
}
fn main() {
State::<Application>::run_once(true);
}