3DCGプログラミングの基礎技術を習得する:OpenGLのすすめ
はじめに
今回の記事は、3DCGプログラミングに興味がある人へOpenGLを勧めるために書いたものです。個人的には、OpenGLに対する関心を高めて、有料記事の販売につなげることが最終的な夢です。
対象読者
本記事が想定する読者は、教養として3DCGプログラミングを学びたい人や、3DCGの基礎技術に興味がある人です。また、使用言語がC言語なので、C言語を習得したばかりで、プログラミングの題材を探している人にも向いているでしょう。
3DCGプログラミング
2024年現在、3DCGのプログラムを作成するには、大きく分けて二つの方法があります
一つはUnityやUEなどのゲームエンジンを使う方法であり、もう一つは、グラフィックライブラリを使う方法です。
本記事が勧めるOpenGLはグラフィックライブラリです。なぜ、ゲームエンジンではなくグラフィックライブラリなのか、その理由をこれから説明します。
まずは、両者を比較します。
ゲームエンジンとグラフィックライブラリの違い
ゲームエンジンとグラフィックライブラリを比べると、前者は、ゲーム作成を容易に行うために、比較的高度な機能を提供しますが、後者は、原始的な機能しか提供しません。
そのため、ゲームエンジンと同等の機能をグラフィックライブラリだけで実現するには、多大な労力を要します。
また、ゲームエンジンでは、シーンやレベルなどの構成要素が予め提供されており、これらを組み合わせていけば、プログラムが完成するようになっています。
これに対して、グラフィックライブラリを使う場合、プログラムをどのような要素から構成すべきなのか、その設計をするのはプログラマの仕事になります。
グラフィックライブラリの利点
さて、これらの相違点からは、ゲームエンジンのほうが容易にプログラムを作成できるように思えます。実際のところ、作りたいものが決まっている場合はゲームエンジンを使用したほうがよいでしょう。
しかしながら、教養や技術の習得の観点からは、上記の相違点は欠点ではなく利点になります。
確かに、ゲームエンジンでは、高度な機能を簡単に実現できますが、簡単であるが故に、その機能は所謂ブラックボックスになっています。
そのブラックボックスの機能をグラフィックライブラリで実現しようとすると、当然に中身の知識が必要になります。知識が必要になると言うことは知識が身につくと言うことに他なりません。
また、グラフィックライブラリには、原始的な機能しかないため、いきなり最新技術を実装することは困難です。
そのため、技術進化の足跡をたどりつつ、徐々に新しい技術を実装していくことになります。
このように、段階的に知識を獲得することで、技術について表面的な知識ではなく、その背景までも含めた深い知識、すなわち教養を身につけることができるでしょう。
最後に、グラフィックライブラリのほうが圧倒的に自由度が高いです。実装する機能はもちろんのこと、プログラムの構成要素も好きに設計することができます。つまり、世界を設計すると言う一番おもしろい作業を自らの手で行えるのです。
以上のように、教養や技術の習得においては、グラフィックライブラリは、ゲームエンジンよりも優れていると言えます。
次に、OpenGLの特徴を紹介すると共に、他のグラフィックライブラリに対する優位性を示します。
OpenGLの特徴
・枯れている
OpenGLは、2017年を最後に進化が止まっています。そのため、古いハードウェアや低スペックマシンでも開発が可能です(私は十年落ちのノートPC向けCPU(と内蔵GPU)で開発しています)。
・金が掛からない
*BSDやLinuxなどのオープンソースOSと、それらのOS上で動くMesa(OpenGLの実装)を組み合わせれば、無償で開発環境を構築することができます。
・公式のドキュメントが充実している
開発元であるKhronosにより、OpenGLの仕様およびリファレンスと、wikiによる技術解説とが一通り提供されています。
その他のグラフィックライブラリとの比較
・OpenGL ESおよびWebGL
OpenGLの派生です。これらは、(OpenGLに導入された)DSAという近代化関数群がないので、開発が面倒です。
・Vulkan
OpenGLの後継です。新しいために情報が少なく、定番となる使用言語が定まっていません。また、OpenGLよりもGPUへの依存性が高いです。
・Direct3D
Microsoftの商業製品です。OSを初め、開発に何かと金が掛かります。
・Metal
なんかAppleのやつです。ブランド代が高いので、Direct3Dに輪を掛けて金が掛かります。
以上のように、OpenGLは、他のグラフィックライブラリに比べて、主に金銭的な負担が軽い点で優れています。
OpenGLにより習得が期待できる技術
・3DCGの基本技術
所謂ラスタライジングと呼ばれるレンダリング手法に関する一連の技術を習得できます。
・シェーディング言語
OpenGLのシェーディング言語であるGLSLを習得できます。シェーディング言語は、どれも似たようなものなので一つを覚えると応用が利きます。
・GPGPU
Compute Shaderと呼ばれる機能により、GPUによる汎用計算技術を習得できます 。なお、Compute ShaderはOpenGLのバージョンに拘らず拡張機能により対応しているので大体のGPUで使えます。
・ソフトウェアの設計技術
OpenGLのプログラミングでは、ステートマシンと呼ばれる大域変数の塊を相手にしなければなりません。そのため、状態や依存関係の管理についての設計技術が向上します(そうでないとプログラムは直ぐに破綻します)。
OpenGLの学習のためのリンク
第一に読むべきは公式のリファレンスであり、次に公式のwikiです。以下のリンクは、これらの補完にすぎません。
Learn OpenGL
解説が平易な文章で書かれており分かりやすいです。wikiと一緒に読むと良いでしょう。
opengl-tutorial
Shadow mappingの実装で参考にした気がします。
以上