OpenGL入門チュートリアルの深い理解

1.OpenGLの紹介

  • OpenGL は、2D および 3D ベクター グラフィックスをレンダリングするためのクロス言語、クロスプラットフォームのアプリケーション プログラミング仕様です
  • OpenGLにはグラフィックスや画像を操作できる一連の関数が含まれていますが、OpenGLにはこれらの関数が実装されておらず、各関数の実行方法とその出力値(インターフェースと同様)が規定されているだけであるため、OpenGLは厳密な仕様にすぎません.
  • OpenGL 仕様では、各関数の実行方法とその出力値が厳密に指定されています。各内部機能をどのように実装するか (Implement) は、OpenGL ライブラリの開発者によって決定されます。通常、実際の OpenGL ライブラリの開発者は、グラフィック カードの製造元です
  • OpenGL は出力専用に設計されているため、レンダリング機能のみを提供しますコア API には、ウィンドウ システム、オーディオ、印刷、キーボード/マウス、またはその他の入力デバイスの概念がありません。これは最初は制限のように思えるかもしれませんが、実行中のオペレーティング システムからレンダリング コードを完全に独立させることができるため、OpenGL はクロスプラットフォーム開発を可能にします
  • OpenGL はシェーダー コンパイラを提供しませんが、グラフィック カード ドライバーがシェーダー コンパイル作業を完了ます
  • コア モードと即時レンダリング モード:
    初期の OpenGL は即時レンダリングを使用します (即時モード、つまり固定レンダリング パイプライン) は、使いやすく理解しやすいですが、効率が低すぎます。OpenGL3.2 以降では、即時レンダリング モードが廃止され、コア モード (コア プロファイル) の使用が推奨されます。
    コア モード: ユーザーが OpenGL とグラフィックス プログラミングを実際に理解する必要があり、これはやや困難ですが、柔軟性と効率性が向上し、グラフィックス プログラミングの理解が深まります。
  • 拡張機能:
    OpenGL の主要な機能は、拡張機能のサポートです. グラフィックス カード会社が新しい機能またはレンダリングの主要な最適化を提案する場合、通常、拡張された方法でドライバーに実装されます.
  • ステート マシン:
    OpenGL 自体が巨大なステート マシン(ステート マシン) です。一連の変数は、OpenGL が現時点でどのように実行されるべきかを記述します通常、OpenGL の状態は OpenGL コンテキスト (Context) と呼ばれます通常、 OpenGL の状態を変更するには、次の方法を使用します: オプションの設定、バッファーの操作最後に、現在の OpenGL コンテキストを使用してレンダリングします
  • オブジェクト:
    OpenGL ライブラリは C 言語で記述されており、多くの言語の派生もサポートしていますが、そのコアは依然として C ライブラリです。C の一部の言語構造は他の高級言語に簡単に変換できないためOpenGL の開発中にいくつかの抽象化レイヤーが導入されました。「オブジェクト(Object)」もその一つです
    オブジェクトを使用する利点の 1 つは、プログラム内で複数のオブジェクトを定義してそれらのオプションを設定でき、各オブジェクトに異なる設定を適用できることですOpenGL 状態を使用する操作を実行する場合、オブジェクトを必要な設定でバインドするだけで済みます

二、OpenGLプログラム

プログラムは CPU 上で実行され、プログラム コードはメモリ上にあること は誰もが知っています. 通常の概念では、CPU とメモリのみが関与しますが、OpenGL を使用したレンダリング プログラムは異なり、GPU とビデオ メモリが関与します。下図のように表示:
ここに画像の説明を挿入

メモリからビデオメモリへ

  • 私たちのプログラムは CPU 上で実行され、プログラムのデータはメモリに保存されます
  • シーンをレンダリングする必要がある場合、シーン内のオブジェクトの頂点データ、テクスチャ データ、シェーダー パラメータなどが必要になる場合があります。これらのデータはプログラムによって指定され、最初は外部メモリに保存され、プログラムが CPU で実行されているときにメモリに読み込まれます
  • グラフィックス カードにはビデオ メモリがあり、このバッファには、グラフィックス バッファ、深度バッファ、テクスチャ、頂点バッファなど、一連のレンダリング シーンに必要なデータを格納できます。これらのデータを使用して、必要なシーンをレンダリングするために GPU のレンダリング命令を実行します。
  • 問題は、メモリ内のデータをビデオ メモリに転送する方法です。
  • これらすべてに対する答えが OpenGL にあることは間違いありません.OpenGL関連の関数を使用して、CPU で実行されているプログラムはデータをビデオ メモリに送信し、シーンのレンダリングに必要なデータをグラフィックスのビデオ メモリ バッファに格納できます。カード

OpenGL レンダリング ステート マシン

  • レンダリングに必要なデータがビデオ メモリに転送されたら、GPU のレンダリング コマンドをどのように実行しますか?
  • GPU のレンダリング命令は、グラフィックス カードの種類などのハードウェア パラメータを含む非常に低レベルであるため、そのような複雑な命令を呼び出すことは不可能です。しかし、OpenGL があります。
  • レンダリングは固定プロセスであり、GPU の基になる命令に接続することはできません.汎用のハードウェアに依存しないレンダリング モデルを構築できますか? もちろんできます。これは OpenGL です。
  • レンダリングはプロセスであり、このプロセスで設定できる多くのオプションがあり、これらのオプションを OpenGL の状態と呼びますいわゆるステート マシンには状態として多くのパラメーターがあり、さまざまなシーン オプションでさまざまなレンダリング結果を表示するなど、さまざまな状態の状況で異なる反応を示します。
  • OpenGL は完全なレンダリング ステート マシンです. Khronos 組織は OpenGL を開発および維持しました. つまり、彼らは OpenGL のステート マシン モデルを確立しました. このモデルはレンダリングに使用され、状態として多くのパラメーターが含まれています。このモデルのために、Khronos 組織は、いくつかの状態設定関数(状態変更関数) と状態アプリケーション関数(状態使用関数)を含む、OpenGL が含むべき関数を策定しました。状態設定関数を使用して OpenGL コンテキスト、つまり OpenGL の状態を変更し、状態適用関数を使用して OpenGL の現在の状態に応じたいくつかの操作を実行します。
  • 冒頭で述べたように、OpenGL は単なる仕様であり、特定の機能の実装はありません。前述のように、OpenGL は多くのステートを含むレンダリング モデルにすぎず、レンダリングに必要な一連の関数仕様を定式化しています。では、OpenGL の数学的モデルと GPU の基礎となるレンダリング命令との間にブリッジを構築するにはどうすればよいでしょうか? つまり、OpenGL で定式化された機能を誰が実装するのか? これは通常、グラフィックス カード開発者が考えるべきことです.グラフィックス カード開発者は、OpenGL モデル仕様に基づいて特定のグラフィックス カード用の OpenGL ドライバーを開発します. つまり、グラフィックス カードは特定のOpenGL状態で特定のレンダリング命令を実行します.
  • このように、必要な GPU レンダリング命令を実行するために、汎用のハードウェアに依存しないステート マシンである OpenGL と対話するだけで済みます。プログラムと OpenGL のやり取りは、OpenGL のオプションを設定したり、状態設定関数を呼び出してバッファを操作したりして、 OpenGL の状態を変更するだけですレンダリング操作の実行などの動作は、状態アプリケーション関数によって実装されますつまり、最初にレンダリング状態が設定され、次にその状態に基づいてレンダリング操作が実行されます。

3.GLFWとGLEW

 上記に続き、OpenGLはレンダリング機能のみを提供し、コアAPIにウィンドウの作成やキーボードの監視などの入力概念がないため、レンダリングを実行したい場合は、レンダリングされた画面をコンピューターのウィンドウに表示する必要があります。私たちはしますか?
 GLFW を使用するだけで、GLFW は、ウィンドウの作成、入力、イベントの受け入れなどの機能をサポートするクロスプラットフォームの OpenGL アプリケーション フレームワークですそのメンバーは GLFW フォームで始まります
 前述のように、OpenGL 関数を使用する場合は、現在のプラットフォームがこの関数をサポートしているかどうかを確認し、この関数のポインターを返す必要があります。これは非常に面倒なことに違いないので、何か便利な方法はありませんか?OpenGL グラフィックス インターフェイスに基づくクロスプラットフォームの C++ 拡張ライブラリである
 GLEW を使用するだけですGLEW は、現在のプラットフォームでサポートされているすべての OpenGL の高度な拡張機能を自動的に識別できますglew.h ヘッダー ファイルが含まれている限り、 gl 、glu、glext、wgl、および glxのすべての関数を使用できます。GLEW は、現在普及しているさまざまなオペレーティング システムをサポートしています。そのメンバーはしばしば gl で始まります。

4. その他

この記事は、参照記事の内容 を引用・引用しています
 この記事の内容はOpenGL学習における個人的な感想に過ぎませんので、不適切な点がありましたら、お気軽にご指摘ください。

おすすめ

転載: blog.csdn.net/qq_51563654/article/details/130233937