入門-01.OpenGL

3216 ワード

OpenGL(Open Graphics Libaray)
OpenGL自体はAPIではなく、Khronos組織によって制定され、維持される規範にすぎない.OpenGLは、各関数がどのように実行され、どのように返されるかを厳格に規定しています.内部の具体的な各関数がどのように実現されるかは、OpenGLライブラリの開発者が自ら決定する(注:ここで開発者はOpenGLライブラリを作成する人を指す).OpenGLライブラリはC言語で書かれており、複数の言語の派生もサポートされていますが、コアはCライブラリです.実際のOpenGLライブラリの開発者は通常、グラフィックスカードのメーカーです.購入した各グラフィックスカードは、通常、一連のグラフィックスカードのために開発された特定のバージョンのOpenGLをサポートします.アップルシステムを使用する場合、OpenGLライブラリはアップル自身が維持します.
コアモード(Core-profile)とインスタントレンダリングモード(Immediate mode)
初期のOpenGLでは、即時レンダリングモード(つまり、レンダリングラインを固定)が使用されていました.つまり、レンダリングモードは確かに使いやすく理解できましたが、効率が低すぎました.OpenGL 3から.2から、仕様書は直ちにレンダリングモードを廃棄し始め、コアモードを発売し、このモードは古い特性を完全に除去した.即時レンダリングモードはOpenGLの実際の操作から多くの詳細を抽象化しているため、学習が容易であると同時に、OpenGLが具体的にどのように操作されているかを把握することも難しい.現代のやり方は使用者にOpenGLとグラフィックプログラミングを本当に理解することを要求して、それはいくつかの難易度があって、しかしもっと柔軟性を提供して、もっと高い効率、更に重要なのはもっと深くグラフィックプログラミングを理解することができます.私たちのチュートリアルはOpenGL 3に向いています.3のコアモード.
新しいバージョンのOpenGLプロパティを使用すると、アプリケーションをサポートできるのは次世代のグラフィックスカードだけです.これも、多くの開発者が低バージョンのOpenGLに基づいてプログラムを記述し、新しい特性を有効にする選択がある理由です.
拡張(Extension)
OpenGLの大きな特性は拡張のサポートであり、グラフィックス会社が新しい特性やレンダリング上の大きな最適化を提案すると、通常は拡張方式で駆動中に実現されます.
ステートマシン
OpenGL自体は巨大なステータスマシンです.OpenGLがどのように動作するかを記述するすべての変数の大きな集合です.OpenGLの状態は通常OpenGLコンテキスト(Context)と呼ばれる.OpenGLのステータスを変更するには、通常、いくつかのオプションを設定し、バッファを操作します.最後に、現在のOpenGLコンテキストを使用してレンダリングします.三角形ではなくOpenGLに線を引くように伝えたい場合、いくつかのコンテキスト変数を変更することでOpenGL状態を変更し、OpenGLがどのように絵を描くかを教えます.OpenGLの状態を線分描画に変更すると、次の描画コマンドでは三角形ではなく線分が描画されます.OpenGLで作業すると、いくつかのステータス設定関数(State-changing Function)、およびこれらのステータスに基づいてステータスが適用される関数(State-using Function)に遭遇します.OpenGLは本質的に大きなステータスマシンであることを覚えておけば、そのほとんどの特性を理解しやすくなります.
オブジェクト(Object)
OpenGL内の1つのオブジェクトは、OpenGLステータスのサブセットを表すいくつかのオプションのセットを指します.たとえば、図形描画ウィンドウの設定をオブジェクトで表すことができます.サイズ、サポートされている色の桁数などを設定できます.オブジェクトをCスタイルの構造体と見なすことができます.
struct object_name {
    GLfloat  option1;
    GLuint   option2;
    GLchar[] name;
};

オリジナルタイプ(Primitive Type)OpenGLを使用する場合は、OpenGL定義のオリジナルタイプを使用することを推奨します.例えばfloatを使用する場合、プレフィックスGLを追加します(したがってGLfloatと書きます).int,uint,char,boolなどは類似している.OpenGLで定義されたこれらのGLの元のタイプは、プラットフォームに関係なくメモリの配置方法です.一方、intなどの元のタイプは、異なるプラットフォームで異なるメモリの配置方法がある可能性があります.GLの元のタイプを使用すると、プログラムが異なるプラットフォームで一貫して動作することを保証できます.
オブジェクトを使用すると、通常は次のように見えます(OpenGLコンテキストを大きな構造体に例えます).
// OpenGL   
struct OpenGL_Context 
{
    ...
    object* object_Window_Target;
    ...     
};
//     
GLuint objectId = 0;
glGenObject(1, &objectId);
//         
glBindObject(GL_WINDOW_TARGET, objectId);
//   GL_WINDOW_TARGET       
glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_WIDTH, 800);
glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_HEIGHT, 600);
//      GL_WINDOW_TARGET      
glBindObject(GL_WINDOW_TARGET, 0);

まずオブジェクトを作成し、idで参照を保存します(実際のデータはバックグラウンドに保存されます).次に、コンテキストのターゲット位置にオブジェクトをバインドします(例では、ウィンドウオブジェクトのターゲット位置をGL_WINDOW_TARGETと定義します).次に、ウィンドウのオプションを設定します.最後に,ターゲット位置のオブジェクトidを0に戻すことで,このオブジェクトを解縛する.設定されたオプションはobjectIdが表すオブジェクトに保存され、GL_に再バインドされるとWINDOW_TARGETの場所では、これらのオプションが再有効になります.
オブジェクトを使用するメリットの1つは、プログラムで1つのオブジェクトを定義してステータスを設定するだけでなく、操作が必要な場合は、設定する必要があるオブジェクトをバインドするだけでよいことです.
追加のリソース
  • opengl.org:OpenGL公式サイト.
  • OpenGL registry:OpenGLの各バージョンの仕様と拡張のメインステーション.