OpenGLには4つの異なるメジャーバージョンがあり、モバイルデバイスと組み込みシステム(OpenGL | ES)およびJavaScript経由のWeb(WebGL)のバージョンはカウントしません。Direct3D 11がDirect3D 8とは異なる方法で行うように、OpenGL 3もOpenGL 1とは異なる方法で処理します。大きな違いは、OpenGLバージョンはほとんどの場合、古いバージョンへのアドオンにすぎません(ただし、完全に)。
OpenGLのさまざまなエディションとバージョンに加えて、メインのOpenGLはプロファイルの概念も追加しました。つまり、互換性プロファイル(古いバージョンのAPIのサポートを有効にする)とコアプロファイル(これらの古いAPIを無効にする)です。以下のようなものはglBegin
、あなたがコアプロファイルを使用する場合がありますが(デフォルトで)互換性プロファイルを使用する際に、単純に仕事をしません。
さらに大きな問題として、OpenGLの一部の実装(特にAppleのようなもの)では、コアプロファイルを使用している場合にのみ新しいOpenGL機能が有効になります。つまり、新しいAPIを使用するには、古いAPIの使用を停止する必要があります。
その後、チュートリアルのいくつかの非常にわかりにくいシナリオになります。
- チュートリアルは古く、廃止されたAPIのみを使用します。
- このチュートリアルは新しく、よく書かれており、コア互換のAPIのみを使用しています。
- このチュートリアルは新しいものですが、互換モードですべてのAPIを有効にし、新しいAPIと古いAPIの両方を自由に混在させるドライバーで作業していると仮定するのは間違いです。
- このチュートリアルは、どのバージョンでも古いAPIをまったくサポートしないOpenGL | ESなどのOpenGLの異なるエディション用です。
このようなものglBegin
は、即時モードAPIと呼ばれることもあります。OpenGLには保持モードがあり、「イミディエートモード」には既にグラフィックスで別の定義があったため、これは非常に混乱しています。OpenGL 2.1以降廃止されているため、これらを単にOpenGL 1.x APIと呼ぶ方がはるかに優れています。
OpenGLの1.x APIは、昔は頂点をグラフィックスパイプラインにすぐに送信していました。これは、頂点をレンダリングするハードウェアの速度が、頂点データを生成するCPUの速度とほぼ同等の場合にうまく機能しました。当時のOpenGLは、三角形のラスタライズをオフロードしただけで、それ以外のことはほとんどしませんでした。
最近、GPUは高度な頂点およびピクセル変換を実行しながら、非常に高速で膨大な数の頂点を噛み砕くことができ、CPUは単純にリモートで追いつくことさえできません。さらに、CPUとGPUの間のインターフェイスはこの速度の違いを考慮して設計されているため、頂点を一度に1つずつGPUに送信することさえできません。
すべてのGLドライバーはglBegin
、内部で頂点バッファーを割り当て、サブミットさglVertex
れた頂点をこのバッファーに入れてから、呼び出されたときに単一の描画呼び出しでそのバッファー全体をサブミットすることによってエミュレートする必要がありglEnd
ます。これらの関数のオーバーヘッドは、頂点バッファーを自分で更新した場合よりもはるかに大きいため、一部のドキュメントでは(非常に誤って)頂点バッファーを「最適化」と呼びます(最適化ではありません。実際に唯一の方法です) GPUと話す)。
OpenGLでは、長年にわたって非推奨または廃止されたさまざまなAPIがあります。いわゆる固定機能パイプラインもそのような要素です。一部のドキュメントでは、引き続きこのパイプラインを使用するか、プログラム可能なパイプラインと組み合わせます。固定機能パイプラインは、グラフィックカードが3Dシーンのレンダリングに使用されるすべての数学をハードコーディングし、OpenGL APIがその数学の構成値の設定に制限されていた昔からのものです。最近では、ハードウェアにはハードコーディングされた数学がほとんどなく、(CPUと同じように)ユーザー提供のプログラム(シェーダーと呼ばれることも多い)を代わりに実行します。
ここでも、固定機能機能がハードウェア上に存在しないため、ドライバーは古いAPIをエミュレートする必要があります。つまり、ドライバーには、独自のシェーダーを提供しない場合に使用される固定機能日からの古い数学を実行する多数の互換性シェーダーが組み込まれています。その古い固定関数状態を変更する古いOpenGL関数(古いOpenGLライティングAPIなど)は、実際には均一バッファーなどの最新のOpenGL機能を使用して、これらの値をドライバーの互換性シェーダーに供給しています。
互換性をサポートするドライバーは、これらの廃止された機能を使用し、それらを最新の機能とスムーズに組み合わせることができることを確認するために、多くの舞台裏での作業を行う必要があります。これは、一部のドライバーが新しい機能を取得するためにコアプロファイルを有効にすることを強制する理由の1つです。同時に使用される古いAPIと新しいAPIの両方をサポートする必要がないため、ドライバーの内部が大幅に簡素化されます。
多くのドキュメントでは、簡単に使い始めることができるという理由だけで、古いAPIから始めることを推奨している場合があります。Direct3Dは、初心者向けにこの問題を解決しました。コンパニオンライブラリ(DirectX Tool Kit)を提供することで、よりシンプルな描画APIと事前に作成されたシェーダーを提供します。残念ながら、OpenGLコミュニティの大部分は初心者向けの互換性プロファイルに固執していますが、古いOpenGL APIと新しいAPIを混在させることができないシステムがあるため、問題があります。さまざまなレベルの機能とターゲットユースケースと言語を備えた新しいOpenGLでのシンプルなレンダリングのための非公式のライブラリとツールがあります(MonoGame たとえば.NETユーザーの場合)、ただし公式に承認されたものも広く同意されたものもありません。
あなたが見つけているドキュメントは、OpenGL向けではないかもしれませんが、他の同様のAPIの1つ向けかもしれません。OpenGL | ES 1.xには固定機能レンダリングがありましたが、頂点サブミット用のOpenGL 1.x APIはありませんでした。OpenGL | ES 2.x +およびWebGL 1+には固定機能機能がまったくなく、これらのAPIには後方互換性モードがありません。
これらのAPIは、メインのOpenGLと非常によく似ています。それらは完全な互換性はありませんが、OpenGLの公式の拡張機能があり、一部の(すべてではない)ドライバーがOpenGL | ES(WebGLのベース)との互換性をサポートしています。以前は物事が十分に混乱していなかったからです。