OpenGLによるグラフィックス処理に関する世界観です。
2D/3DグラフィックスのためのオープンなAPI。Windowsで言えばDirectXと同様の技術。
最近はゲーム制作にはUnityという高度なフレームワーク(ゲームエンジン)を使うことがあるが、それでも描画を独自に実装したいという用途は多い。
APIがクロスプラットフォームであり、クロスプラットフォームなOpenGL対応ツールキットGLUTを使うことで、WindowsでもLinuxでも組み込み向けでも同じように作ることが出来る。
OpenGL for Embedded Systems。AndroidやiOSなどのモバイルプラットフォーム向けのOpenGL。
OpenGLの基本は、シェーダと座標変換。
シェーダとは、「陰をつけるもの」の意味で、3Dグラフィックスに陰をつけて立体的に見せることができる。
そのままモデルを表示すると、単に重ね合わされるだけで立体的に見えない。シェーダによって頂点と表面の処理を行って陰をつけることで、立体的な3DCGに見える。これがシェーダの基本的な役割。
3Dグラフィックスは基本的にシェーダによって描画される。
頂点の処理を行うバーテックスシェーダと、テクスチャの処理を行うフラグメントシェーダがある。
頂点の処理を行うバーテックスシェーダにより、正しい位置にモデルが表示され、表面のテクスチャの表現を行うフラグメントシェーダによってシェーディング(陰をつける処理)が行われる。
OpenGLの部分はCPUで動き、シェーダの部分はGPUで動く。昔のGPUは単純な定型処理しかできなかったが、今ではプログラマブルシェーダによってGPUの実行する内容を変更できるようになった。
座標変換を行うことで、それぞれのモデルを奥行きのついた正しい大きさと位置と形で画面全体に表示できる。
まずローカル座標(ローカルなモデルの中の座標)をワールド座標(世界全体の絶対座標)に変換し、次にカメラから見たビュー座標に変換する。
その後に、プロジェクション座標変換で3Dのグラフィックスを2Dに変換する。
この時、パースをつけて近くにあるものを大きく、遠くにあるものを小さく描画するのを透視投影と言い、パースをつけずに同じ大きさで描画するのを並行投影と言う。
最後に、スクリーン座標変換でディスプレイの座標へと変換した上で表示する。
以下のページを参考にしました。
パース・遠近法・透視図法も参照のこと。
(詳しいことはやねうらお氏の「Windowsプロフェッショナルゲームプログラミング2」に書いてあります。)
画像を合成する時、どの画像を前にし、どの画像を後ろにするかを、Z軸という意味で「Z-order」と呼ぶ。
基本的に、後ろにあるものから描画していく。この時「抜き色」といって、ある色を透明にすることがある。これを「スプライト」と呼ぶ。
グラフィックスは表画面(primary surface)にいきなり描くのではなく、裏画面(secondary surface)で描画が終わってから表画面に送る。スクロールされた時は、スクロールした部分だけを再描画する。この時のsecondary surfaceをリングサーフェースと呼ぶ。
東京大学の以下のページは、OpenGLとGLUTを使ったグラフィックスプログラミングの入門として参考になります。
また、京都女子大学の小波秀雄さんによる以下のPDFは、Netpbmというオープンソースパッケージの画像フォーマットを使った画像ファイルのRubyプログラムによる作成として面白い教材となっています。
GLUTやfreeglut(GULTをさらに強化したもの)。コールバック関数を多用する。
以下にサンプルコードがあります。
GLFWはGLUTやfreeglutに変わる新しいOpenGLフレームワーク。
GLUTとは違い、普通の上から下に続いていくプログラムでツールキットを書ける。
以下にサンプルコードがあります。
シェーダや拡張機能などの現代的な機能を提供する、ほぼ必須のライブラリ。
以下にサンプルコードがあります。
OpenGLの実装の1つ。
新しいGallium3DはMesaを置き換えようとしている。
OpenGLで描画を行う際、プロプライエタリなドライバ(NVIDIAなど)を使う場合や、Mesaを使う場合、Gallium3Dなどを使う場合がある。
GLXはOpenGLとX Window Systemにおける両者の間でのバインディング。
DRIはXサーバを経由せず、Xクライアントが直接GPUにアクセスできるようにするための仕様。高速な描画が可能となる。Mesaが利用している。
DRMはカーネルの機能で、DRIを実装するための技術。DRMにより、クライアントがフレームバッファに直接描画できる。
X11設定とプログラミングも参照のこと。
DirectXはWindowsにおけるOpenGLと同様の技術。
Windowsにおけるゲームを開発するためにはこれを使用する。Microsoft謹製で、C#やXboxなどMicrosoftによる技術と相性が良い。
DirectXも参照のこと。
ゲーム開発を参照のこと。
GPUを参照のこと。
僕は、OpenGLで3Dのゲームを作るコツは、座標変換と配置と移動ではないかと思います。
たとえば、マリオカートのようなレースゲームを作る場合、まずコースやマップを作り、その上でコースの上にキャラクターを「配置」し、その上でプレイヤーの操作に応じて、キャラクターを「移動」させなければなりません。
OpenGLには、座標変換の機能が多数あります。こうした座標変換の機能を使ったり、ワールドとキャラクターの3DCGの合成を行うことで、配置や移動を行います。また、同じキャラクターやワールドを別の角度から視認することもできます。
僕は、ゲームを作るコツは、座標変換の機能を上手く使いながら、3DCGの配置と移動をどのようにし、どのように合成するか、ということではないかと思います。
そして、それ以上はデザインの問題になります。OpenGLではテクスチャと頂点によるポリゴンの描写が可能で、Blenderなどの3Dモデリングソフトウェアを用いてポリゴンを作ることができます。
後日注記:3DCGを合成することで絵を配置することはできますが、実際には周りの場所と調和した見た目にしなければなりません。こうした時にシェーダを使うのではないかと、僕は勝手に思っています(実際は違うと思います)。
僕が思うに、OpenGLを使って、3DCGのブラウザを作ると面白いと思う。
Webブラウザは、普通HTMLファイルをダウンロードして、それをDOM形式のツリー構造にパースして、そのDOMを2DのWebブラウザ上に表示する。
この2DのWebブラウザの部分を、OpenGLによる3DCGに取り換えられるようにする。
たとえば、
<Miku style="face: smile;">みんなこんにちは、初音ミクだよ!</Miku>
のように書いた3DMLファイルを表示させるだけで、画面上に笑顔の初音ミクが表示でき、音声で「みんなこんにちは、初音ミクだよ!」とミクボイスで話すようにする。
最終的には、VRと結合して、メタバースで動くようにしたら面白いかもね。
そんなブラウザができたらいいなと、そんな願望の話でした。
残念ながら、初音ミクの3DMLは作れない。なぜなら、初音ミクのボイスの使用料が発生するため、無料で作ることができない。もし作るとしたら、初音ミクと同様の3DCGを自前で作った上で、初音ミクと同様のボカロ音源も自分で作るしかない。
一番簡単なのは、初音ミクの製造元であるクリプトンがブラウザそのものを作ることだ。それ以外の方法では作れないだろう。
クリプトンが作る以外の方法としては、初音ミクの部分だけを「コンポーネント」というデータにして、コンポーネントだけをクリプトンから購入するようにする。
この3DMLが優れているのは、簡単にゲームを作ることができるようになるという点だ。すなわち、キャラクターは初音ミクでなくてもいい。マリオでもいいしルイージでもいい。そのようなキャラクターを、ブラウザでHTML/CSS/JavaScriptで操作するのと同じように、3DML/3DCSS/JavaScriptで操作できるようになる。そのため、ゲームを作るのがとても簡単になる。
初音ミクを使ったゲームは誰でも簡単に作れるようになる。ただし、キャラクターを使う時に必ずお金を払ってコンポーネントの使用料を買う。そのようにすると作れる。
「こんなプラットフォームを誰が買うの?」と人々は思われるでしょうが、初音ミクと関係なく、OpenGLの標準プラットフォームの地位を勝ち取ればいいのだ。そうすれば、みんなこのプラットフォームを使うようになる。そこに「初音ミクをぜひとも使わせたい!」と思うようなゲームコンテンツを多数投入して、そのゲームコンテンツで儲ければいいのだ。それは難しくはない。ネットスケープはWebサービスが今のように大儲けするプラットフォームにするとは考えなかったが、結果ネットスケープの作ったWebの世界はたくさんの利益の出る優良プラットフォームになった。それを日本のクリプトンがやってもおかしくはない。さあ、HTMLの部分をOpenGLに書き換えて、ぜひともOpenGL-Webブラウザを作ろうではないか!
ただし、実際には初音ミクだけをコンポーネントとして売るのは買う人が少ないだろうから、初音ミクのゲームコンテンツと一緒に初音ミクを買うという形になるだろう。つまり、初音ミクのゲームを買うと、デジタル音源の初音ミクがついてくるようになる。それなら、普通に買う人はいると思う。そもそも昔のプレステのゲームは高額だった。それなりに高くてもゲームなら買う。面白いゲームにすればいいだけの話だ。
2024.06.16