HEXA BLOG

プログラム

HEXA BLOGプログラム2021.3.3

C++20がまもなく正式公開されるのでRustを始めてみた

春になって禁断症状🧟(目と鼻が大変なことになる)を抑えるために
💊が手放せないgood sunこと山口です。

blog投稿も1年ぶりかそれ以上のスパンになりまして📆
完全に前回の投稿を忘れてしまいつつ時代も進みました。
C++20がそろそろ正式公開目前となりドキュメントのページもさらに増量📚、
個人的にはC++17でも十分おなかいっぱい、
且つそろそろ新しい事を始めてみたいなと思ったので、
巷で人気のRustを始めてみました。

ガベコレが無いのはとても魅力的です。
D言語もガベコレさえなければなぁと考えてしまいます。

Rustの導入の仕方はgoogle先生に聞くと沢山の先人が丁寧に教えてくれるので割愛します。
(WindowsならVisutal Studio Codeから使える環境が楽なのでお勧めです)
代わりに実際Rustで何かツールを作り始めたりするきっかけになるような
超簡単サンプルを書いてみようと思います。
(因みにWindowsにすっかり毒されているのでWindows環境での説明になります。)

今回挑戦するのOpen Image IOです。
オープンソースの画像入出力ライブラリですが
Image Magickより高速という一点でお気に入りのライブラリです。
別に.psdや.exrを読み込まなければもっとお手軽なのはあるかと思いますが、
ついつい色々なフォーマットサポートしたくなるのがツール制作者のサガです。

残念ながらOIIOはネイティブなRustライブラリではないので、
vcpkg install openimageio:x64-windows-static-md
でOIIOをインストールするところから始まります。
インストールには6GB程ストレージを消費します。
私はx64-windows,x64-windows-staticと二回ほどTriplet指示をミスしてえらい事になりました。
OIIOはこの依存関係だけは好きになれないです。

ついでにvcpkgは
vcpkg integrate install
をしておくと環境変数にパスを通す必要がなくなります。(openimageio-rsのビルド時に必要)
加えてもしかしたらvcpkgはC:\直下に展開しておく必要があるかもしれません。
openimageio-rsのCMakeLists.txtに
target_include_directories(openimageio_rs PRIVATE "C:\\vcpkg\\installed\\x64-windows\\include\\")
という不穏なパスがあるので私はおとなしくCに展開しました。

という感じで最低限の準備が整ったら
cargo new プロジェクト名
で新しいプロジェクトを作ります。

cargo.tomlに
[dependencies]
openimageio = { git = "https://github.com/ennis/openimageio-rs" }
とOIIOのRustバインディングであるopenimageio-rsを追加します。

準備が出来たのでmain.rsに
use openimageio::ImageBuffer;
を追加して試しにビルドしてみます。

もしかしたらlibclangのパスが見つからないとエラーになるかもしれません、
その時はLLVMダウンロードページからpre-build版をダウンロードしてきてインストールします。

ビルドが完了したら
openimageio-rsのlib.rsを参考に画像を読み込んで違う形式で保存するサンプルを書いてみます。

use openimageio::{ImageBuffer, ImageInput, ImageOutput};

fn main() {
let img = ImageInput::open("rust_icon.psd").unwrap();
let image: ImageBuffer<u8> = img.read(0,0, img.all_channels()).unwrap();
let mut out = ImageOutput::create("rust_icon.exr").unwrap();
let mut out = out.open(&img.spec()).unwrap();
let _result = out.write_image(image.data());
}

これでPSD形式の画像を読み込んでEXR形式で保存できます。
画像はプロジェクトフォルダ直下が
cargo run
したときに読まれるパスになります。

と超少量プログラムの為、
ほぼほぼopenimageio-rsの導入方法になってしまいましたが、
Rustの凄いところはこの導入までに幾つものライブラリ不足等に陥るのですが、
的確な原因が全てビルド時のエラーメッセージに示されます🕵
その為少しややこしいライブラリでもgoogle先生に前例が無くて導入を諦める場面はかなり少ないのではと思いました。

という事でゲーム開発に直接使用されるかは分かりませんが、巷で注目のRustの紹介でした。
個人的にはこのまま手動権を取ってもええんやで感でいっぱいです。
(アロケーションのカスタマイズは面倒ぽいですけど)
頑張って布教活動したらRustで開発も夢じゃないかも
ではまた👋

RECRUIT

大阪・東京共にスタッフを募集しています。
特にキャリア採用のプログラマー・アーティストに興味がある方は下のボタンをクリックしてください

RECRUIT SITE 

NEWS