はじめに
こんにちは、エンジニアのうぃすきー(@whisky_shusuky)です。
本記事は Synamon Advent Calendar 2022 の14日目の記事になります。
RustはWeb関連でもそこそこ使われており興味があったのですが難しそうな印象が有ったため手をつけられていませんでした。 そんな中Rustで始めるOpenGLという本に出会いました。 個人的に趣味でWebGLでGLSLを書いたことがあったため、Rustで動かしてみれば理解がとっつきやすいのではないかと思い読んで動かしてみました。
成果物
先に成果物を見せるとこのようなものができました。 本書の内容を実行すれば立方体をOpenGLで表示することができます。 そこに理解のために少し手を加えて画面上でx,y,z軸方向に立方体を回転できるようにしました。
rustで定義した回転行列をシェーダー側に渡せたわ pic.twitter.com/kVxJtyLSI9
— うぃすきー@12/25 21:40 Cluster DANCE&MUSIC~キャラバンのクリスマス (@Whisky_shusuky) 2022年12月13日
コードはこちらに置いておきました。 github.com
Rust,sdl2をインストールしてcargo run で動作します。(macでのみ動作確認しています)
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh brew install sdl2 cargo run
手を加えた回転部分はRust側で回転行列を定義してシェーダーに渡しています。 rotation_x,rotation_y,rotation_zがそれぞれウィンドウ上で操作できる値になっておりそれらを増減することで回転します。
let mut model_matrix = Matrix4::from_angle_x(cgmath::Rad(rotation_x)); model_matrix = model_matrix * Matrix4::from_angle_y(cgmath::Rad(rotation_y)); model_matrix = model_matrix * Matrix4::from_angle_z(cgmath::Rad(rotation_z));
Rust独特だと思ったのは単純にlet
だけで変数を定義しただけでは変数の再代入ができないことでした(それは定数では...?)
初期化の際にlet mut
と宣言することで再代入できるようになります。
読んだ感想
個人でGLSLを書いていたときはシェーダー上で回転行列を直接定義していました。Rustで定義した値をシェーダー側に渡せるので色々面白いことができそうな気がしています。シェーダーエディタのデスクトップアプリとか作れそうです。
恐る恐る触ってみたRustですがなんとか動くものができました。Webに関わっていないので今度はAPIでも試しに作ってみたいです。