目次

ギャラリー

はじめに

商業出版に寄せて
想定読者
使用するライブラリーとプラットフォーム
ソースコードのダウンロード
免責事項

第1章 開発環境の準備

1.1 Rustのインストール
1.2 cargoコマンド
1.3 Hello, World!

第2章 SDL

2.1 準備
2.2 プログラムの作成
2.3 プログラムの完成

第3章 OpenGL

3.1 準備
3.2 プログラムの作成

第4章 Dear ImGui

4.1 準備
4.2 プログラムの作成
4.3 プログラムの完成
4.4 効果的な使い方

第5章 3Dオブジェクト

5.1 プログラムの作成
5.2 プログラムの完成

第6章 テクスチャー

6.1 準備
6.2 プログラムの作成
6.3 プログラムの完成
6.4 光の効果

第7章 フレームバッファーオブジェクト

7.1 プログラムの作成
7.2 プログラムの完成
7.3 ポストエフェクトの効果

おわりに

ギャラリー

図1: Dear ImGuiのスクリーンショット
図2: 3Dオブジェクトの描画
図3: 立方体へのテクスチャーの描画
図4: フレームバッファーオブジェクトと球体エフェクトの適用
図5: フレームバッファーオブジェクトとレトロTVエフェクトの適用


はじめに

 本書は、Rustを使ってOpenGLプログラミングを行う入門書です。

 プログラミング言語であるRustは、最近とても注目されている言語のひとつです。Stack Overflowによる開発者を対象とした年間調査「Developer Survey」の中で、「もっとも愛される言語」にも選ばれ、Rustを利用したプロジェクトも増え続けているようです。12

 OpenGLの入門書の多くはC/C++やPythonが多いですが、本書はRustからOpenGLを扱うはじめての商業出版の書籍です。RustからOpenGLを扱う書籍を書こうと思ったきっかけは、Rustを使うことで3つのメリットが得られるからです。

 ひとつめは、処理速度が速いことです。C/C++にも負けない処理速度を出せるRustを使えば、フレームレートを60FPSに維持することも容易になるでしょう。

 ふたつめは、ガベージコレクションがないことです。1秒間に60回も画面を描画するプログラムが、ガベージコレクションによって一瞬の遅延を起こした場合、目に見えて動きがカクつくようになります。ガベージコレクションがないことで、処理を安定させることができるのです。

 3つめは、モダンなプログラミング言語がもつ便利な特徴・環境を使用できることです。Rustでソースコードを書けば、さまざまな環境で動くプログラムをとても簡単にコンパイルすることができます。また、新しくライブラリーを導入するときも、Rust用ライブラリーがたくさん登録されているレポジトリの中から、目的に合うものを選んで設定ファイルに書けば、あとはコンパイル時に自動でダウンロードしてくれます。

 このように、OpenGLプログラミングする上で、Rustはとても適しているのです。

 また、本書ではOpenGL上で便利なGUIを追加できる、Dear ImGuiというライブラリーを導入します。このライブラリーを使えば、画面上にOpenGLの描画設定を変えるウィジェットを配置することができるので、設定をコントロールしながらその効果を即座に体感できるようにしました。これまでの世の中に出回っているサンプルコードは、パラメーターを変えてからいちいちコンパイルし直すのが常でしたが、ウィジェットの操作によってすぐに設定変更できるので、より直感的に習得できるようになるでしょう。

 本書を読み終わる頃には、OpenGLの基本を習得し、そこから3D CGのクリエイティブな作品を作ることや、3Dの独自コンソールを作ることができるようになるでしょう。

商業出版に寄せて

 本書はもともと技術同人誌として自費出版したものを大幅に加筆・修正して、商業出版に至った書籍です。技術同人誌版では書ききれなかったフレームバッファーオブジェクトに関する内容も加え、さらに3D CGの表現力を豊かにできる一冊になりました。

 2019年に技術同人誌を世に出したときには、Rustという言葉が少しずつ注目されはじめている頃でした。最近では、マイクロソフトをはじめとして、多くの現場でRustが活躍している記事を目にするようになり、さらにその注目度が加速しているように感じられます。これからもますます開発の現場でRustが採用されていくのではないでしょうか。

 Rust関連の書籍も少しずつ増えてきていますが、この書籍も皆さんのお役に立てることを願っています。

 また、私に商業出版のお話をくださったインプレスR&D編集長の山城敬さん、表紙のイラストを担当してくださったはこしろさんに、この場を借りて感謝申し上げます。

想定読者

 本書の想定する読者は、RustとOpenGLに興味のあるプログラマです。Rust以外の言語でも、開発経験があることが望ましいです。

 Rustでプログラミングをする際に必要になるコマンドや、ライブラリーの導入方法、エラー処理方法など、最低限の必要な項目は解説を入れています。さらに詳しいRustの使い方に関しては、Rustのマニュアルや、専門書を参考にしてください。

使用するライブラリーとプラットフォーム

 本書では、OpenGLを使う上で、ゲーム製作の現場でもよく使われているマルチメディアライブラリー「SDL」を使います。SDLはクロスプラットフォームなライブラリーなので、Linux、Windowsの両方で使用することができます。SDLのバージョンは2.x系を利用します。Rustのsdl2 crateを使うために、SDLのバージョンは2.0.8以上を使うのが好ましいでしょう。

 OpenGLも、クロスプラットフォームな標準規格なので、どこでも使用することができます。OpenGLはグラフィックボードの性能によって、利用できるバージョンに上限があります。本書で使用するOpenGLのバージョンは3.1、シェーダーで使用するGLSLのバージョンは1.4です。この3.1というのは、2009年に発表されたバージョンです。あえて少し古いバージョンにしたことで、多くの機種で動作するようにしました。古いとはいえ、OpenGLのもっとも基本的な使用方法は今も変わりませんし、初心者がはじめて学習するのに適しています。

 また、OpenGLのGUIライブラリーである「Dear ImGui」を導入することで、3D空間でのパラメーター調整をウィジェット経由でできるようにします。

 本書が解説するプラットフォームは、LinuxとWindowsです。Mac OS Xでの動作は未検証です。もしそのままのコードで動作しなかったとしても、使用しているSDLやOpenGLがクロスプラットフォームなライブラリーなので、小さな修正で動作できるようになると思います。

 本書のRustは、2018エディションで記述しています。コンパイラーのバージョンは、2019年12月にリリースされた1.40で動作可能であることを確認しています。

ソースコードのダウンロード

 本書に掲載されている各章のソースコードは、すべて公開しています。ソースコードの共有サイトであるGitHubから、すべてのソースコードをダウンロードできます。次のリンクが公開ページです。

ソースコードの公開ページ

https://github.com/toyamaguchi/rust_opengl

 各ディレクトリーが本書の各章の内容と対応しています。進捗に合わせてソースコードを閲覧してください。

免責事項

 本書に記載された内容は、情報の提供のみを目的としています。したがって、本書を用いた開発、製作、運用は、必ずご自身の責任と判断によって行ってください。これらの情報による開発、製作、運用の結果について、著者はいかなる責任も負いません。

 本書の中に記載している会社名、商品名は、一般に各社の登録商標です。TM表記等については記載しておりません。

 本書の一部あるいは全部について、無断での複写・複製・アップロードはお断りします。

1. https://insights.stackoverflow.com/survey/2018#technology-_-most-loved-dreaded-and-wanted-languages

2. https://insights.stackoverflow.com/survey/2019#technology-_-most-loved-dreaded-and-wanted-languages



第1章 開発環境の準備

 この章では、Rustの開発環境の準備を行います。

 すでにRustの開発環境が整っている場合や、新規パッケージの作成方法を知っている場合は、次の章へ進みましょう。

1.1 Rustのインストール

 Rustの公式サイトから最新のインストール方法で、Rustをインストールしましょう。

Rustの公式サイト

https://www.rust-lang.org/

1.1.1 Unix系OSの場合

 Linux、Mac OS、その他のUnix系OSを使用している場合、現在推奨しているインストール方法は次のコマンドによるものです。

curlとシェルスクリプトによるインストール

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

 curlでインストールスクリプトを取得して、そのままスクリプトをシェルにパイプし、実行します。

 インターネット上のスクリプトをそのまま実行する方法は、しばしばセキュリティー上の懸念が問題視されています。

 便利ですが、将来インストール方法が変更になる可能性もあるため、公式サイトで最新のインストール方法を確認しましょう。

1.1.2 Windowsの場合

 Windowsを使用している場合、まずVisual Studio C/C++をインストールする必要があります。

 最近では、個人利用の場合はVisual StudioのCommunity Editionを無料で使うことできるので、これをインストールしましょう。最新のVisual Studio Community Editionを探しながら、インストーラーをみつけましょう。

Visual Studioのインストール方法解説ページ

https://docs.microsoft.com/ja-jp/visualstudio/install/install-visual-studio

 インストーラーを起動すると、Microsoftのアカウント作成を求められます。アカウントを持っていない場合は作成して、Visual Studioに登録しましょう。

 Visual Studioのインストールが完了したら、Rustのインストールを行います。RustをWindowsにインストールする場合、次のインストーラーのリストの中から最適なものを選びます。

インストーラーのリスト

https://forge.rust-lang.org/infra/other-installation-methods.html
#other-ways-to-install-rustup

 リストの中には、Windows向けの選択肢がいくつかありますが、環境によって選択肢を選びましょう。

 ・Visual Studioを使う場合

  ─64 bit Windows: x86_64-pc-windows-msvc

  ─32 bit Windows: i686-pc-windows-msvc

 ・MinGWのgccコンパイラーを使う場合

  ─64 bit Windows: i686-pc-windows-gnu

  ─32 bit Windows: x86_64-pc-windows-gnu

 ダウンロードすると、rustup-init.exeが保存されます。これを起動することで、インストールが始まります。デフォルトの設定でインストールを進めていきましょう。コンパイラー、スタンダードライブラリー、cargoコマンド、ドキュメントなどのダウンロードが始まります。環境変数に、Rust関連コマンドへのPATHも通してくれるので、コマンドプロンプトやPower Shellのプロンプトから、Rustのコマンドを入力できるようになります。

 Rustのバージョン情報が表示され、Rustがインストールされたことが表示されたら、作業は完了です。これでRustプログラミングをスタートできますね。

 確認のため、WindowsのコマンドプロンプトやPower Shellのプロンプトを表示して、rustc --versionと入力してみましょう。Rustコンパイラーのバージョン情報が表示されたら、問題ありません。

 コマンドプロンプトにバージョン情報が出力されなかった場合は、インストーラーを起動する前から開いていたコマンドプロンプトである可能性があります。新しく追加した環境変数のPATHが適用されるよう、一度コマンドプロンプトを開きなおしてから、再びrustc --versionを実行することをお勧めします。

1.2 cargoコマンド

 Rustをインストールしたことで、いくつかのコマンドが実行できるようになりました。その中でもcargoコマンドは、Rustプログラミングでもっとも使う頻度の高いコマンド、といっても過言ではありません。

 cargoに関する詳細な解説は、次のオンラインドキュメントがあります。

The Cargo Book

https://doc.rust-lang.org/cargo/index.html

 ここでは、いくつかの大切な使用例を挙げていきます。

1.2.1 パッケージディレクトリーの作成: cargo new

 Rustのプログラミングを始める上で、ソースコードや設定ファイルなどを入れるパッケージディレクトリーを作成します。

cargoによる新規パッケージの作成

cargo new PACKAGE_NAME

 PACKAGE_NAMEの文字列は、これから作成したいディレクトリー名に置き換えてください。このコマンドによってディレクトリーが作成され、さらにその中にパッケージ管理のためのファイルや、サンプルのソースコードが作成されます。

1.2.2 ソースコードのコンパイル: cargo build

 いったんパッケージディレクトリーの中に入り、その中で次のコマンドを入力することで、ソースコードのビルドが始まります。

cargoによるソースコードのビルド

cargo build

 デフォルトでは、最適化オプションが付いていない、debugモードでビルドが始まります。最適化してコンパイルしたい場合は、--releaseオプションを付けてビルドをしましょう。

1.2.3 プログラムの実行: cargo run

 パッケージディレクトリーの中で次のコマンドを入力すると、ソースコードのビルドの後、プログラムが実行されます。すでにビルド済みの場合は、すぐにプログラムの実行へと移ります。

cargoによるプログラムの実行

cargo run

 最適化してコンパイルしたい場合は、--releaseオプションを付けて実行しましょう。

1.3 Hello, World!

 cargo new PACKAGE_NAMEして作成されたパッケージディレクトリーは、次のようなディレクトリー構成になっています。

リスト1.1: パッケージディレクトリーの構成

├── Cargo.toml
└── src
    └── main.rs

 Cargo.tomlは、このパッケージディレクトリーに関する情報が含まれています。具体的には、パッケージの名前、バージョン、作者、Rustコンパイラーのエディション、ライブラリーの依存情報などが含まれます。

 main.rsには、次のような単純なサンプルコードが含まれています。

リスト1.2: src/main.rs

 1: fn main() {
 2:     println!("Hello, world!");
 3: }

 これは「Hello, world!」という文字を出力するだけのソースコードです。プログラムのスタート地点であるmain()関数と、その中に、文字列を出力するコードがあります。println!()のように、最後にビックリマークがある関数はマクロです。

 cargo runすると、次のように出力されます。

Hello, World!の出力

Hello, world!

 これでRustのプログラミングをする準備が整いました。次の章では、SDLを使ったプログラミングを行います。

試し読みはここまでです。
この続きは、製品版でお楽しみください。