スポンサーリンク

Rust glutinクレートでOpenGLのウィンドウを開く

OpenGLのウィンドウ生成。

Cargo.toml

 

[package]
name = "testglutin"
version = "0.1.0"
edition = "2021"

[dependencies]
glutin = "0.26.0"
gl="0.14.0"

 

main.rc

fn main() {

    let event_loop = glutin::event_loop::EventLoop::new();
    let window = glutin::window::WindowBuilder::new().with_title("Rust glutin OpenGL");
    
    
    // GLのコンテキストを作成
    // この gl_context は ContextBuilder<NotCurrent,Window> 型
    let gl_context = glutin::ContextBuilder::new()
        .with_gl(glutin::GlRequest::Specific(glutin::Api::OpenGl, (3, 3)))
        .build_windowed(window, &event_loop)
        .expect("Cannot create context");
    
    // Rustにはシャドーイングがあるので、同じ名前の別変数を同じスコープ内に定義できる。
    // この gl_context は ContextBuilder<PossibleCurrent,Window> 型
    // 以降、gl_currentは以前の型の意味で用いることはできない
    let gl_context = unsafe {
        gl_context
            .make_current()
            .expect("Failed to make context current")
    };

    // OpenGLの各関数を初期化
    // これでgl::Viewportをはじめとする各関数の関数ポインタにアドレスが設定され、呼び出せるようになる。
    gl::load_with(|symbol| gl_context.get_proc_address(symbol) as *const _);

    // event_loopを開始する
    event_loop.run(move |event, _, control_flow| {

        // Pollを指定するとループが走り続ける
        // Waitを指定するとイベントが発生したときだけループが動く。
        *control_flow = glutin::event_loop::ControlFlow::Wait;


        match event {

            glutin::event::Event::WindowEvent { event, .. } => match event {


                ////////////////////////////////////////////////////////////////////
                // ウィンドウを閉じる
                glutin::event::WindowEvent::CloseRequested => {
                    // ウィンドウが閉じられた場合、event_loopを停止する
                    *control_flow = glutin::event_loop::ControlFlow::Exit;
                },

                ////////////////////////////////////////////////////////////////////
                // ウィンドウのサイズを変更
                glutin::event::WindowEvent::Resized(new_size) => {

                    // ビューポート再設定
                    unsafe {
                        gl::Viewport(0, 0, new_size.width as i32, new_size.height as i32);
                    }
                },

                ////////////////////////////////////////////////////////////////////
                _ => (),
            },


            _ => (),
        }

        // 描画
        unsafe {
            gl::Clear(gl::COLOR_BUFFER_BIT);
            gl::ClearColor(0.3, 0.3, 0.5, 1.0);
        }
        // スワップバッファ
        gl_context.swap_buffers().unwrap();
        

    });


}

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: