https://github.com/glium/glium/blob/master/book/tuto-01-getting-started.md
cargo new --bin my_project
cd my_project
생성된 폴더에는 프로젝트 메타데이터가 있는 Cargo.toml 파일이 생성됨
src폴더에 main.rs 파일이 생성
src폴더에 lib.rs 파일이 생성되어 있으면 --bin 플래그가 빠졌으므로 lib.rs파일을 main.rs 파일로 이름변경 필요
[dependencies]
glium="*"
#[macro_use]
extern crate glium;
fn main() {
}
그래픽 어플리케이션을 제작할때 첫번째 단계는 윈도우 생성
아래와 같은 단계로 glutin으로 OpenGL창을 초기화
1. window와 device event를 처리하기 위한 EventLoop 생성
2. glium::glutin::WindowBuilder::new()를 이용하여 window parameter를 지정, 이 과정은 OpenGL과는 무관한 단계
3. glium::glutin::ContextBuilder::new()를 이용하여 context parameter를 지정, 멀티샘플링/vsync와 같은 OpenGL 관련 속성을 지정
4. OpenGL 창 생성
glium::Display::new(window, context, &event_loop).unwrap()을 이용하여 window와 context를 사용하여 display를 만들고 eventloop를 등록
fn main() {
use glium::glutin;
let mut 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();
}
생성된 창은 바로 종료되므로 eventloop를 실행
event_loop.run(move |ev, _, control_flow| {
let next_frame_time = std::time::Instant::now() +
std::time::Duration::from_nanos(16_666_667);
*control_flow = glutin::event_loop::ControlFlow::WaitUntil(next_frame_time);
match ev {
glutin::event::Event::WindowEvent { event, .. } => match event {
glutin::event::WindowEvent::CloseRequested => {
*control_flow = glutin::event_loop::ControlFlow::Exit;
return;
},
_ => return,
},
_ => (),
}
});
cargo build를 실행하여 창 생성을 확인
OpenGL은 double Buffering을 사용
Window에 직접 내용을 그리는 대신 memory에 그리고 memory내용을 화면에 Frame 단위로 표현
Frame에 그리기를 시작하려면 아래 내용을 호출
let mut target = display.draw();
target을 drawing surface로 사용
화면에 색상을 채우기 위해 아래 코드 호출
target.clear_color(0.0, 0.0, 1.0, 1.0);
Frame에 그리기를 마치려면 아래 코드 호출
target.finish().unwrap();
main.rs
extern crate glium;
fn main() {
use glium::{glutin, Surface};
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();
event_loop.run(move |ev, _, control_flow| {
let mut target = display.draw();
target.clear_color(0.0, 0.0, 1.0, 1.0);
target.finish().unwrap();
let next_frame_time = std::time::Instant::now() +
std::time::Duration::from_nanos(16_666_667);
*control_flow = glutin::event_loop::ControlFlow::WaitUntil(next_frame_time);
match ev {
glutin::event::Event::WindowEvent { event, .. } => match event {
glutin::event::WindowEvent::CloseRequested => {
*control_flow = glutin::event_loop::ControlFlow::Exit;
return;
},
_ => return,
},
_ => (),
}
});
}