OpenGLを使用してゲームエンジンをゼロから作成する[終了]


14

学習目的のためにゲームエンジンをゼロから書き始めたいのですが、前提条件とその方法、プログラミング言語や推奨事項を教えてください。また、その上に良い記事や本がある場合、それは素晴らしいでしょう。前もって感謝します!

私のプログラミング言語とツールは次のとおりです。

  • C / C ++はCのみを使用するのが良いですか?
  • Python
  • OpenGL
  • ギット
  • GDB

私がそれから学びたいこと:

  • コアゲームエンジン
  • レンダリング/グラフィックス
  • ゲームプレイ/ルール
  • 入力(キーボード/マウス/コントローラーなど)

レンダリング/グラフィックスの場合:

  • 3D
  • シェーディング
  • 点灯
  • テクスチャリング

2つのポイント:この質問は、あまりにも広範です。どの機能が必要か、どのプラットフォームをサポートしたいか、どのパラダイムを調査したいのか、スクリプト言語(もしあれば)にどの程度の責任を負わせたのか、その他多くのことわざわざリストに載るつもりはありません。
テトラッド

8
2:ゲームなしでエンジンを作ることに集中してはならないという他の人々が口にする一般的な知恵があります。ゲームのないエンジンは、エンジンが役に立つことを証明できないことを意味します。良いエンジンでは、人々が自分のドッグフードを食べる必要があります。一般的にリンクされたことをここにあるこの引数のよりに行くブログ:scientificninja.com/blog/write-games-not-engines
テトラッド

2
^それだけでなく、機能要件をやる気にさせるためにゲームなしでエンジンを書くと、機能のクリープと悪いAPIデザインが発生します。ゲームの要件から示唆される、必要なものがわかるまでは、エンジンに有用なものを入れないでください。同様に、エンジンを使用してプログラミングする必要がなかった場合、決定のいくつかが本当に不格好であることに気付くかもしれません。
ChrisE

1
リスティングにそのポイントが表示されません。C / C ++とPythonを知っているという事実が私たちを助けてくれますが、なぜバージョン管理とデバッガーを使用できるのかを挙げてください。
共産主義のダック

2
@TheCommunistDuck:ねえ、それはいくつかの開発者よりも優れています。:)
ChrisE

回答:


11

実質的にあらゆるレンダリング方法を使用して、実質的にあらゆる言語でゲームエンジンを作成できます。たとえばコンソール出力を使用して、bashでゲームエンジンを作成できます。

したがって、独自のエンジンを記述する際に何を学びたいかを正確に定義することが最善だと思います。ゲーム開発には多くの「フィールド」があります。

  • コアゲームエンジン

  • レンダリング/グラフィックス

  • AI

  • ネットワーキング

  • ゲームプレイ/ルール

  • 入力(キーボード/マウス/コントローラーなど)

など。そこからサブトピックを作成することもできます。レンダリング/グラフィックスで

  • 2dまたは3d?

  • モデリング

  • シェーディング

  • 点灯

  • テクスチャリング

  • GUI / Huds /インターフェース。

  • などなど

それらのサブサブトピックの1つだけで、何時間も(または何年も!)勉強することができます。

そのため、まず何を学びたいかを定義します。シンプルに始めましょう。

特定のタスクに適している言語もありますが、使いやすい言語を使用してください。たとえば、コアエンジンとレンダリングはおそらく、C / C ++などの「下位」レベルの言語で行うのが最適です(パフォーマンスが必要な場合)。しかし、AIやゲームルールのようなものは、より高いレベルの言語で行う方が適切かもしれません。何も混ぜ合わせてはいけないということはありません。エンジンをC ++で記述し、レンダリングをCで記述して(OpenGLで適切に動作するため)、LUAを使用してゲームルールなどをスクリプト化できます。

例に関しては、Slick2Dと呼ばれるゲームエンジンがあります。Javaで書かれており、オープンソースです。これは、非常にうまく書かれて設計されたシンプルな2Dエンジンの例です。ゲームループ、ゲームの状態管理など、基本的な概念を学ぶことができます。

C / C ++に慣れている場合; SDL / OpenGLをご覧になることをお勧めします。入力、サウンド、ウィンドウの作成などのハウスキーピングの一部を処理し、他のものに集中できます。


4
ああ、私がC ++とコンソールゲームを学んでいた日々はとても楽しかった... [新しいコンソールプロジェクトを作成...]
ニックベッドフォード

私は私の質問を更新しました、私に多くの素晴らしいリソースを与えたいと思います:)
Wazery

3

SDL + OpenGLは、カスタムゲームエンジンを起動するための優れた選択肢です。

個人的にはC ++のCっぽいバージョンを使用していますが、それは私にとって最適だとわかったからです。つまり、例外を使用しないということです。それには2つの理由があります。何よりもまず、例外は例外的に安全なコードを必要とするため、OpenGLとSDLを使用して実現するのは簡単ではありません。しかし、もっと重要なのは、この方法でC ABIを介してC ++オブジェクトを公開することは非常に簡単で、スクリプト言語をミックスに取り入れようとする場合に非常に役立ちます。

私はあなたと同じような船に乗っています。他の誰かが興味を持っている場合に備えて、SDLとOpenGLでの冒険をブログ(immersedcode.org)に書き留めました。

一般的なアーキテクチャについては、2つの提案があります。3Dエンジンが必要な場合は、Jason Landerの本「Game Engine Architecture」をご覧ください。必要なのが2Dだけである場合は、デザインをできるだけシンプルにし、XNAや他のプロジェクトからインスピレーションを得てください。

最後に:OpenGLをどこでも呼び出さないでください。必要に応じて、デスクトップOpenGL / OpenGL ESまたはDirectXを後で切り替えることができるように、いくつかの場所に分けてください。


0

実装の詳細が銃口であなたを保持しない限り、Cを使用しないでください。それ以外の場合は、C ++を使用します。C++は非常に優れた言語であり、後でこれらの機能を使用しないことをいつでも選択できるためです。私は個人的にPythonに対して/ Pythonに対して何も持っていません。

DXには最新のオブジェクト指向のアプローチがあるため、DirectXに対してOpenGLをお勧めしません。OpenGLが提供するインターフェイスは、比較すると非常に劣っています。

最後に私が得たのは、GDBがまったく、まったくひどいもので、Visual Studioデバッガーがはるかに優れていると信じている多くの人々から聞いたことです。これは私の個人的な経験ではないので、少量の塩で服用してください。


4
「OpenGL vs. DX」。DirectXがオブジェクト指向であるという事実はそれほど重要ではありません。より理解しやすい限り... OpenGL(3より前)は、非常に単純なインターフェースを公開し、Cスタイルの命令型の方法論にあるため、スキャンが容易です。「射影行列をこれに設定します。三角形を開始します。これが頂点です。これが頂点です。これが頂点です。三角形を終了します。」OpenGL APIの1.xシリーズは、グラフィックプログラミングに足を踏み入れるのに適しています。SDL(またはGLUT ... urg)と組み合わせると、30〜50行のコードでアプリを起動できます。
ChrisE

2
@クリス:確かに。と呼ばれるものがありextern "C"、それを適切に使用すると、Cインターフェイスを書くのがかなり簡単になります。特にPythonの場合は、Boost内にバインドを簡単にするコンバーターが存在します。C ++言語機能はどうですか?彼らは素晴らしいです。C ++の言語機能をさらに使用すると、プロジェクトの信頼性とコーディングの容易さが大幅に向上し、許容できる非常に小さなパフォーマンスのトレードオフが実現します。Cの言語機能は、比較すると哀れです。たとえば、最新のC ++コンパイラを正しく使用すると、メモリリークが発生しないことが保証されます。C.でそれを行う
DeadMG

1
@DeadMG:OOPが本当に大したことだったら、ここでの答えはJavaまたはC#であり、C ++ではありません。私が反対するのは、C ++機能を使用しても、コードが魔法のように改善、高速化、または信頼性が向上するわけではないということです。これらの機能の使用方法を知っおく必要があり、エンジンの設計に加えて言語を学習しているのは本当に時間の有効活用ですか?いいえ。初めてこれを行う人はいません。Cのすべてを1日か2日で快適に学ぶことができ、言語が何をしているのか迷うことはありません。任意のレートで設定される便利な基本呼び出しであるOpenGLは、同じ透明性を提供します。
ChrisE

2
OOPはそれほど大したことではなく、高性能のゲームエンジンではありません。確かに便利ですが、しばしば間違った抽象化です。通常、良好なデータフロー、ローカリティ、メモリレイアウトを使用する方が適切です。多くのチームがC ++を使用していますが、ほとんどのC ++機能は使用していません。例外はありません。可能な限り少ないバーチャル、RTTI、STL /ブーストはありません。どうして?複数のプラットフォームでの予測可能な高速実行と小さなコード。私はCでコーディングしますが、C ++を使用したい領域は、スコープロックと汎用配列の2つだけです。面倒な私見の価値はありません。
無効

4
GLとD3Dの場合:GL3 / 4コアにはマトリックススタックはなく、attribスタックもありません。GLとD3Dはどちらも同じハードウェアアーキテクチャにマッピングされますが、多くの場合、GLはより薄く感じられます。GLステートマシンは少し面倒ですが、実際のハードウェアもそうです;)それらのいずれかを学習するのは問題ありません。実際に何が起こっているかを理解している限り、他の(またはコンソールAPI)に簡単に切り替えることができます。
無効
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.