Getting Started

Mickey·2022년 1월 25일
0

glium

목록 보기
1/14
post-thumbnail

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 파일로 이름변경 필요

glium dependency 추가

[dependencies]
glium="*"

main.rs에 라이브러리 임포트

#[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,
            },
            _ => (),
        }
    });
}

profile
Mickey

0개의 댓글