23. 拡張とバージョン

23.010  どこで種々の OpenGL 拡張に関する情報が得られますか?

OpenGL拡張レジストリーはOpenGL拡張のための中心的な資源です。 またWebページがOpenGL拡張についてのたくさんの情報を管理するOpenGLorg

OpenGL機器は 共通の消費者で入手可能な拡張のリスト 入手可能です

ここには拡張の同様なリストがあります

23.020  どのバージョンの OpenGL をプログラムで使用しているかどうすれば分かりますか?

OpenGLバージョンがgl.hのa Cプリプロセッサー定義に任命されることが普通です。 これは、アプリケーションがOpenGLバージョンをコンパイル時間に知っていることを可能にします。 この定義を使うために、コードは以下のように見えるかもしれません:

#ifdef GL_VERSION_1_2
   //使用OpenGL1.2機能#endif

OpenGLは、メカニズムも、ランタイムでOpenGLバージョンを検出することに提供します。 アプリはglGetString(GL_VERSION)を呼び、帰りのストリングを構文解析することができます。 帰りのストリングの最初の部分は、フォームをもっているにちがいありません リリース数または他のベンダ具体的な情報がオプションで続いている[主要数].[少ない数] 。

どのようなOpenGL呼び出しでも あなたとして、glGetString()を使うために、現在の文脈が必要です

23.030  OpenGL1.0、1.1、および1.2各バージョンの違いは何ですか?

OpenGL1.1では、以下の機能は入手可能です

OpenGL1.2では、以下の機能は入手可能です

OpenGL1.2.1は、2番目のARB-承認された拡張、GL_ARB_マルチテクスチャーを追加し、それは、複数のテクスチャーマップが単一のプリミティブに適用することを可能にします。 またこの拡張を使うために拡張ストリングをチェックしてください

23.040  OpenGL の異なるバージョンに対してどのようにコーディングするか?

OpenGL開発環境で機能または拡張が入手可能なので、アプリを築くために使う それはそれがエンドユーザーのシステムでの使用で利用可能なのを意味していません。 それらの機能と拡張が入手可能ではない時には、コードは、機能または拡張電話をかけることを避けなければなりません。

プログラムが初期設定する時には、それはOpenGLバージョンおよび入手可能な拡張についての情報のためのOpenGLライブラリを問い、その質問の結果に基づく適切な条件文によってバージョンおよび拡張具体的なコードを取り囲まなければなりません。 例えば:

#include<stdlib.h>
   …
gl12Supportedされたint;

gl12Supportedします =atof(glGetString(GL_VERSION))>= 1.2 ;
   …
もし(gl12Supportedする)ならば
   //使用OpenGL1.2機能}

23.050  どの拡張がサポートされているかはどうすればわかるか?

glGetString(GL_EXTENSIONS)への呼び出しによって、ランタイムでアプリケーションが構文解析することができる拡張名のスペース分離されたストリングが戻ります

23.060  目的のプラットフォームに存在していないかもしれない拡張に対してはどのようにコーディングするのか?

ランタイムでは、アプリケーションは、glGetStringを使って具体的な拡張の存在を問い合わせることができます(GL_EXTENSIONS)。 中で興味がある具体的な拡張を、サポートされた拡張のリストに検索してください。 例えばポリゴンオフセットされた拡張インタフェースが入手可能であるかどうかのわかりアプリケーションは言うことができます:

#include<string.h>
   …
const GLubyte *str;
glPolyOffExtAvailableなint;

str=glGetString(GL_EXTENSIONS);
glPolyOffExtAvailableです(strstr((const雑用*)str、「GL_EXT_polygon_offset」)!= NULL
);

もしそれが入手可能ならば、アプリケーションは拡張を使うことができるけれども、もしそれが利用できないならば、それには代案計画が必要です(すなわち、同じ機能を得るある他の方法)。

もしアプリケーションコードが複数のプラットフォームにコンパイルする必要があるならば、それは、いくつかの拡張が定義されない開発環境を処理しなければなりません。 CとC++において、地方振興環境において拡張が定義されない時には、プリプロセッサーはコンパイルから拡張具体的なコードを保護できます。 例えば:

#ifdef GL_EXT_polygon_offset
   glEnableです(GL_POLYGON_OFFSET_EXT);
   glPolygonOffsetEXT(1./(フロート)0x10000);
#endif/*GL_EXT_polygon_offset*/

23.070  マイクロソフト Windows では拡張ルーチンをどのようにコールするのか?

アプリケーションはすでにいくつかの拡張がマイクロソフトのopengl32.libを通して入手可能なのを発見するかもしれません。 しかし、OpenGL機器とデバイス・ドライバに依存するので、特定のベンダ具体的な拡張は、リンク時間で存在しないかもしれません。 もしopengl32.libでそれが存在しないならば、ランタイムで機器のICDから拡張のエントリポイントのアドレスを得る必要があるでしょう。

ここには、ARB_マルチテクスチャー拡張のための獲得機能ポインタを示す例コードセグメントがあります

拡張を定義する包括ヘッダー。 これは、すべての拡張のための定義を含
んでいるここに示されるようにベンダ具体的な.hファイル、またはGL/glExt.hであるかも
しれません。 */
#include「GL/glExt.h」

宣言機能ポインタ*/
PFNGLACTIVETEXTUREARBPROC glActiveTextureARB;
PFNGLMULTITEXCOORD2FARBPROC glMultiTexCoord2fARB;

…
    拡張エントリポイントのアドレスを得てください。 */glActiveTextureARB=(PFNGLACTIVETEXTUREARBPROC
    )wglGetProcAddress(「glActiveTextureARB」);
    glMultiTexCoord2fARB=(PFNGLMULTITEXCOORD2FARBPROC)wglGetProcAddress(「glMultiTexCoord2fARB
    」);

拡張機能のエントリポイントアドレスを得た後に、使うことを望む 正常な機能ポインタとしてそれらを通って単に呼びかけます

/*セットテクスチャーユニット0minとmagは染み込みます
    (*glActiveTextureARB)(GL_TEXTURE0_ARB);
    glTexParameterf(GL_TEXTURE_2D、GL_TEXTURE_MAG_FILTER、GL_NEAREST);
    glTexParameterf(GL_TEXTURE_2D、GL_TEXTURE_MIN_FILTER、GL_NEAREST);
…
    /*引きmultiによりクワタ*/は織られました
    glBegin(GL_QUADS);
      (*glMultiTexCoord2fARB)(GL_TEXTURE0_ARB、0.fおよび0.f);
      (*glMultiTexCoord2fARB)(GL_TEXTURE1_ARB、0.fおよび0.f);
        glVertex3f(32.f、32.f、および0.f);
 …
    glEnd();

wglGetProcAddress()についてのより多くの情報は、MSDNドキュメンテーションを通じて入手可能です

機能ポインタを通って明示的に呼びかけることがわずらわしいのを発見するかもしれません機能ポインタを取り除かないけれども、コードをより美的に喜ばすことを考慮してCプリプロセッサーでそれを隠すので、glext.hの修正されたバージョンは入手可能です それ 。

23.080  Linux では拡張ルーチンをどのようにコールするのか?

マイクロソフトWindows(そして所有権を主張したUNIXインプリメンテーションと違った)のように、拡張エントリポイントはスタティックリンクライブラリで定義されえません。 ランタイムでは、Linuxアプリケーションが機能のアドレスをロードし、この機能ポインタを通って呼びかけなければなりません。

LinixはOpenGL ABIを使います

23.090  拡張一覧およびファンクションのプロトタイプはどこにあるか?

OpenGL拡張レジストリーを見てください

具体的なファイルのために

glext.h
wglext.h
glxext.h

glext.hはgl.hのための置換であらず、それは補足です。 それは、インタフェースを、すでにプラットフォーム具体的なgl.hにより定義されていなかったすべての拡張に提供します。 これが、複数のグラフィックスドライバー where 中心的なソース(からのgl.h をサポートするプラットフォームに必要である 例えば マイクロソフトまたはXFree86)は、より頻繁にアップデートされたベンダドライバーから提供された機能を追跡できません。