OpenGLを使うとき知っておくと便利な基礎知識

あまり長々と歴史とか仕組みの説明をしていたら眠くなってしまいますから、やりたくないのですが、この辺は僕が独学で進めていくうちに非常に躓いたところなので説明しなければならないと思います。 それでもできるだけ簡潔な説明をするように努力します。

すべてを理解する必要はありませんが、全体像は知っておいたほうがいいと思うので第1回にまとめておきます。 1回目は流し読みくらいでもいいです。

これから先のページに進むにつれて、OpenGLの理解が深まってくると思うので、その時にまた読み直してください。

ざっくりと最低限のハード知識

GPU

グラフィックドライバはCPUやGPUに付属していて、CPUとは要するにパソコンの脳で、GPUはその補助をします。 グラフィックドライバには主にIntel、NVidia、AMD製のものなどがあります。

NVidia、AMDはGPU(グラフィックボード)というパーツを製造しています。 とても大雑把にまとめると、GPUとは単純なプログラムを超高速に行えるパーツです。 OpenGLはこのGPUを活用して、高速に映像を作り出しています。 基本的にはシェーダというプログラムを作っていくことになります。

しかし、すべてのPCで高い性能が必要ということはないので、GPUを内蔵していないPCも多いです。 その場合、CPUで処理をするのですが、CPUは本来こういった処理は苦手です。 なのでその昔CPUはGPUの機能を取り込みました。

もちろんGPUを取り付けたPCには全然及びません。 内臓グラフィックや(昔はマザーボードについていたこともある機能なので)オンボードグラフィック、単にオンボードと呼ばれたりします。

ここではCPUやGPUを知らない人のために書きましたが、なんとなくイメージできることを優先したので厳密には違ったりします。 PCに使われているパーツなどに使われているパーツなども調べてみると奥が深いので気が向いたらやってみるといいかもしれません。

なぜ新しいOpenGLを使わないのか

これは第0回に書きましたが、対応してないパソコンが多いからです。

追記: 新しいバージョンの方が簡潔に書けることがほとんどですし、正直現状では古いパソコンをサポートする理由はほとんどないと思います。バージョン4以上、せめて3以上で開発すると幸せになれます。

GPUもCPUも各メーカーがしのぎを削って開発をしていますので、どんどん性能が向上して、機能も増えていっています。 当然、OpenGLもその機能を使うために進化しています。

しかし、新しい機能は古いGPUやCPUではサポートしてないということがあります。 そして、プログラムをしていくにあたって、常に最新の機能が必要だということはありません。

もちろん新しい機能が必要な場合は、新しいOpenGLを使うべきです。 そんな時はユーザーには「このプログラムを実行したければより高価なPCを購入しなさい」というしかありません。

実際に、ゲームなどにおいては顕著です。 新しいゲームのためにPCの買い替えをする人も多いでしょう。

GLU(OpenGL Utility Libraries)の現状

GLUとはOpenGLを補助するライブラリで、gluLookAtやgluPerspectiveなどがあります。 それぞれ視点などを設定します。

結論から言いますと、GLUは現在でも使えないことは無いと思いますが、基本的により高機能なGLMを使います。

詳しく調べているわけではありませんが、新しいOpenGLではGLUに対応しているか怪しいですし、わざわざ10年以上放置されているライブラリを使うメリットはないでしょう。

GLU

後で詳しく説明しますが、gluLookAtやgluPerspectiveはgl_ModelViewProjectionMatrixという組み込みの変数に値を設定しています。 しかし、現在ではglm::LookAtやglm::Perspective等によってC++側でModelViewProjection行列を作成し、シェーダー側にuniform変数として送るのが主流のようです。

グラフィックスライブラリの種類

OpenGL(GLSL)、DirectX(HLSL)、Vulkan、Cg、Java 3Dなどがあります。

最も有名なのがオープンソースのOpenGLとマイクロソフトが開発しているDirectXです。 DirectXはWindowOS上でのみ動作し、OpenGLは様々な環境で動作します。 CGをするならこのどちらかを使うことになると思います。

VulkanはVRなどのソフトを作るにあたって非常に高度なチューニングをできるようにしています。 そのため立ち位置としては一応OpenGLの後継となっていますが、OpenGLよりも高い知識や技術を求められます。 (別にOpenGLに致命的問題があるわけではなく、用途が違うという話です)

なのでOpenGLとは別物と考えてもらっていいと思います。 OpenGLの開発は続いており、これからも進化していくので安心してください。

Cgはすでに開発が終了されており、今から使う理由はまったくありません。

Java 3Dはそもそも存在感はありません。 ってか使っている人を見たことない。何のために存在しているのかよくわからない子です。 JavaでもOpenGLは使えるのでそちらを使いましょう。

まとめるとOpenGLかDirectXのどちらかを使いましょう。

CGとは誤魔化しの技術

CGに限らずプログラミングはどこまで行っても誤魔化しの技術です。

C言語などでもint型やdouble型が存在するのはコンピューターの計算資源が有限だからです。 無限の数値をコンピューター上で実現するのは不可能なので、現実的な範囲のみ実現しています。

CGプログラミングについても同じです。 無限に滑らかな曲線や曲面を描くことはできません。

あくまで画面出力したときに曲線や曲面に見えることが重視されています。

なので基本的に曲線は複数の直線によって近似されます。

古き良きOpenGLと新しいOpenGL

ざっくりとOpenGLの歴史を見ていきましょう。

バージョン
1992 OpenGL 1.0
1997 OpenGL 1.1
2006 OpenGL 2.1
2008 OpenGL 3.0
2010 OpenGL 3.3
2010 OpenGL 4.0
2010 OpenGL 4.1
2011 OpenGL 4.2
2012 OpenGL 4.3
2013 OpenGL 4.4
2014 OpenGL 4.5
2017 OpenGL 4.6

このOpenGL 1.x系ではglRotateやglScaleなどの関数がありました。 これは意図したポリゴンを回転させたり、拡大したりする関数です。

先に行っておきますが、これらの関数は現在では非推奨とされていて、現在はシェーダーを使って行列計算などによってこれらの処理を実現しています(ただ、glRotateやglScaleの代用関数がGLMに用意されているので、そこまで難しく考える必要もないです。)。

これらの関数の利点は行列計算などの知識が全くなくてもプログラムを作れてしまうところです。 それもあってか、古き良きと言っている人もいます。 僕は大学でこれを習ったのですが、もう使われてないのになんで習ったんだろ? 欠点は柔軟性に乏しく、処理に無駄が多いことです。

OpenGL 2.1でプログラマシェーダーGLSLが標準仕様となりました。

OpenGL 3.0では肥大化したOpenGL仕様のシェイプアップを行って、多くの機能が非推奨・廃止予定になりました。 ただ、OpenGLはバージョンによる互換性を維持するために廃止された関数を拡張機能として使えるようにしています。 これがさらに仕様を複雑にしているように思います。。。

OpenGL 4.x系ではライバルのDirectXに負けじと非常に速い進化をしています(それまでは結構ゆっくりでした)。

ここで詳しく説明をしちゃうとごちゃごちゃしちゃうので、気になる方はWikiを参考にしてください。

次回からやっとコードを書いていきます。