『RustではじめるOpenGL』を読んだ

概要

RustとOpenGLを使ってリアルタイム3Dのデスクトップアプリケーションを作る方法を紹介する本。ある程度RustとOpenGLについて理解していることを前提に書かれている。OpenGL*1SDL*2、Dear ImGui*3(ImGuiと略される)といったC言語ライブラリと、それに対応するRustのcrateが紹介されている。

その他感想とか

  • OpenGLが難しい
    • APIWebGLとほぼほぼ同じように見える
    • レンダリングのための手数が多くて、それを一つ一つ丁寧にメソッドコール書かないといけないのが大変
    • 空で書ける気がしないので実際のアプリケーション作成にあたってはサンプルコードをゴリゴリに参考にすることになりそう
  • Vertex構造体やFrameBuffer構造体の中でnewするときにOpenGLにバインドする処理などを押し込むのは、関心が外にもれなくて可読性が高そう
  • OpenGL crateはAPIコールにunsafeを要求するので悲しみがある
    • Cライブラリに対する薄いWrapperを目指してるっぽいので仕方ない
  • ImGuiが楽しい
    • 短いコードでリッチなGUIをゴリゴリ作れる
    • こんな感じにWindow.build() の引数のクロージャにメソッドを書き連ねることで、呼んだ順にパーツが子ウィンドウに配置される
Window::new("Hello world")
    .size([300.0, 100.0], Condition::FirstUseEver)
    .build(&ui, || {
        ui.text("Hello world!");
        ui.text("こんにちは世界!");
        ui.text("This...is...imgui-rs!");
        ui.separator();
        let mouse_pos = ui.io().mouse_pos;
        ui.text(format!(
            "Mouse Position: ({:.1},{:.1})",
            mouse_pos[0], mouse_pos[1]
        ));
    });
  • UnityのIMGUIに似てる
    • 名前は似てるが別物である
  • 変数のバインドが統合されており、楽
  • パーツの種類が豊富
    • ui.show_demo_window() を実行すると使用できるUIが一通り確認できる
  • Rust実装がunsafeブロックを要求しないので嬉しい
  • リアルタイムレンダリングの基礎が学べて良かった
    • 基礎的なレンダリングパイプラインを組み、フォンライティングを実装した
    • 理論は理解してるつもりだけど、実装するとなると別次元の難しさがある
      • 行列演算をプログラムですることにあまり慣れていない
        • ひたすらコードを書いて手計算とコードのマッピングに慣れるとよさそう

*1:ローレベルなグラフィックスAPI/ライブラリ。

*2:グラフィックスやサウンド、入力インターフェースを扱うマルチメディアライブラリ。すごいプリミティブなゲームエンジンみたいなものと認識してる。

*3:OpenGLで動くGUIライブラリ。簡単なコードでちっちゃいウィンドウを出して様々なUIパーツを配置できる。めっちゃくそ便利。活用していきたい。