C言語とOpenGLで作るゲームエンジン開発記録: 全体のイントロダクション
この記事は、C言語とOpenGL、GLFWを使用した自作ゲームエンジン gl_choco_engine の開発記録です。
ChangeLog
- 2025-11-21 Book2 step2_6「このステップでやること」に記載していた、ウィンドウ生成処理を行う関数名の誤記修正(application_run -> application_create)
- 2025-11-22 Book1 step1_0 対応プラットフォームについて「Windowsは未定」->「Windowsもサポート」に修正
- 2025-11-22 GL Choco Engineの立ち位置を本記事に追加し、それに伴い全体を整理
- 2025-11-22 Book3(2d-rendering-step3)リリース
本連載記事のゴール
この記事の最終的なゴールは、下記の機能を有するゲームエンジンを開発することです。
- テキストレンダリングが可能
- UI用の2Dレンダリングと3Dモデルのレンダリングが可能
- 複数のテクスチャを使用したマテリアルを有するモデルのレンダリングが可能
- 複数シーンを有し、シーンの切り替えが可能
ゲームエンジンとは
ゲームプログラムは、ゲームロジックやシナリオといった各ゲーム固有の機能と、レンダラーやリソース管理といった汎用的に使える機能に分けることが出来ます。ゲームエンジンは、後者の汎用的に使える機能をまとめたものです。
これを使うことで、ゲーム開発を行う際に、開発者はゲーム固有の機能に注力すれば良いため、開発効率を上げる効果があります。
オリジナルのゲームエンジンを作る意義
世の中には様々なゲームエンジンが存在し、UnityやUnreal Engineが著名なエンジンで、ゲーム開発において広く使われています。ただ、ゲームエンジンには得手不得手が存在し、ゲームのジャンルによっては十分な性能を出せないケースも存在します。
例えば、3Dのシューティングゲームと、2Dのシューティングゲームではレンダラーに求められる機能は大きく異なります。このため、開発するゲームの性格によってはオリジナルのゲームエンジンを開発する場合もあります。例えば、Street Fighter6ではカプコンオリジナルのRE Engineを使っていますし、Metal Gear Solid4ではコナミオリジナルのFox Engineを使っています。
また、オリジナルのゲームエンジンを使用することで、ライセンスは自由になりますし、ベンダーに依存しないことで、ベンダーがなくなってしまう等のリスクを回避することもできます。
GL Choco Engineの立ち位置
ここまでゲームエンジンについての一般論を解説しましたが、その上で今回、私が開発するGL Choco Engineの立ち位置について説明します。
先程、ゲーム開発を効率化するためにゲームエンジンがある、と説明しました。ただ、ゲームエンジンの存在意義はゲームだけに留まりません。例えば、簡単な3Dモデルのビューワーや、カメラ画像に対して追加の情報を重畳表示する、といったアプリケーションにも適用可能です。他にも、LiDAR等の点群情報を描画するといったアプリケーションにも有用でしょうし、ロボットの動作のシミュレーション、姿勢のビジュアライズといった用途にも有用です。
現在、ゲームエンジンとしてUnityやUnreal Engineが存在し、また、ロボット制御やセンサー情報のビジュアライズにはROS2が広く使われています。これらミドルウェアは汎用的なPCで動かすことを前提としています。
しかし、実際の産業機器、制御システム、自動車、建機、農機の分野においては、コスト、耐環境性能、消費電力、耐用年数等の理由で汎用的なPCを使用できない環境は多く存在します。
そのような現場では、産業用Raspberry Piのような小型ボードコンピュータや専用コントローラ上で、最小限のリソースで動作する描画系が求められます。
また、機械やロボットの開発の際には、動きをビジュアライズしたいケースというのは多く存在します。この場合、汎用的なPCを使用することができますので、UnityやROS2の使用を検討する場合があります。ただ、必ずしもそれだけが唯一の選択肢とは限りません。
Unityの場合、高額なライセンス費用について稟議が通らないケースや、予算削減のタイミングでライセンス更新が難しくなる、といったリスクを考慮する必要があります。ROS2 の場合も、対応していないセンサーやロボットに対しては自前でインターフェイスを実装する必要がありますし、バージョンアップに伴って既存の構成が動かなくなる可能性もゼロではありません。
一方で、自前でグラフィックスソフトを開発する場合についてですが、適切なコンピュータグラフィックスプログラミングの手法を知らない状態で作ってしまうと、使いまわしが効かず、性能も悪いソフトが出来てしまいがちです。
そのため、本記事では「とりあえず動くことだけを目指したアプリケーション」をいきなり作るのではなく、まずは共通基盤としてのゲームエンジンを設計・実装し、その上に用途別アプリケーションを載せていく方針を取ります。GL Choco Engine は、そうした用途のためのシンプルなベースエンジンとして位置づけています。
今回、私が開発するゲームエンジンは、汎用的なPCだけでなく、ラズベリーパイ3、4のような比較的非力なコントローラもターゲット環境として扱います。そのため、凝ったエフェクトや、大規模なモデルの大量同時レンダリング、高度な物理レンダリングによるリアルな描画、といったことは行いません。
一方で、
- 複数関節を持つロボットの描画
- 代表的なテストシーンであるSponzaを描画するためのマテリアル情報の扱い
といった、「産業用途やツール用途でよくあるレベル」の機能まではサポートします。この程度の機能で十分なグラフィックアプリケーションというのが、実際の現場では非常に多いためです。
また、開発する機能は意図的に絞りますが、だからといって決していい加減なものを作るつもりはありません。扱う機能の範囲を限定する代わりに、その範囲内では堅牢性・読みやすさ・メンテナンス性を重視し、高品質なプログラムを目指します。
この連載の対象読者
GL Choco Engine は、次のような場面で「ちょうどよい」エンジンになることを狙っています。
- UnityやUnreal Engineを使うほどではない、小規模な 2D / 軽量 3D のアプリケーションを作りたいとき
- ROS2 などの大きなミドルウェアは使いたくないが、最低限の描画ループとリソース管理は整ったものを使いたいとき
- ミドルウェア任せではなく、C言語とOpenGLの低レイヤー技術を、自分の手で扱い・理解したいとき
ただ、機能を絞っているといっても、あくまでゲームエンジンです。ソフトウェアの規模としては数万行規模となり、それなりに大きなソフトとなります。リソース管理、アセット管理、イベント処理...と多くの機能を作る必要がありますし、それに必要な技術領域は多岐にわたります。このため、長期間に渡る開発になりますし、多くの機能が複雑に絡み合うソフトになるため、開発過程は独特の世界観を醸し出します。
ゲームエンジン開発はハマる人にとってはメチャクチャ楽しい題材です。開発過程で非常に多くのことを学べます。GL Choco Engineは、最終的な成果物としてのゲームエンジンだけでなく、比較的低レイヤーの部分から自力で作っていく開発過程を記録として残すことで、C言語中級者や、組み込み・ロボット・制御の現場で軽量な描画基盤を試したいエンジニアにとっての教育用ツールとしても機能することを目指します。
シリーズの構成
2D Rendering編
2D Rendering編では、実行基盤・メモリ管理レイヤーを整え、ウィンドウ生成から2Dレンダリングの最小構成までを扱います。
Discussion