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機能#endifOpenGLは、メカニズムも、ランタイムでOpenGLバージョンを検出することに提供します。 アプリはglGetString(GL_VERSION)を呼び、帰りのストリングを構文解析することができます。 帰りのストリングの最初の部分は、フォームをもっているにちがいありません リリース数または他のベンダ具体的な情報がオプションで続いている[主要数].[少ない数] 。
どのようなOpenGL呼び出しでも あなたとして、glGetString()を使うために、現在の文脈が必要です。
23.030 OpenGL1.0、1.1、および1.2各バージョンの違いは何ですか?
OpenGL1.1では、以下の機能は入手可能です:
- 頂点は配列し、それは、頂点データをディスプレイリストにないOpenGLに転送するために必要なサブルーチン呼び出しの数を減少させることを意図しています
- ポリゴンはオフセットし、それは、深さテストに先がけて、満たされるプリミティブのラスタ化による破片の深さ価値が前または後ろにシフトされることを可能にします
- 論理演算はRGBAモードにおいて実行できます
- アプリケーションにOpenGLに勧めさせる テクスチャーイメージのための好まれた記憶装置精度 内部のテクスチャーフォーマット
- プロキシを織ってください。それは、ランタイムでアプリケーションがテクスチャー資源のその用法を仕立てることを可能にします
- テクスチャーをコピーし、サブ織ってください。それは、アプリケーションがframebufferまたはクライアントメモリーからテクスチャーのテクスチャーまたはサブ地域をコピーすることを可能にします
- オブジェクト テクスチャー配列およびそれらの関連したテクスチャーパラメータに述べさせることについての, を織ってください 単一のテクスチャーオブジェクトとして扱われる
OpenGL1.2では、以下の機能は入手可能です:
- ハードウェア加速ボリューム表現をサポートする三次元の織り
- より表面的なファイルとハードウェアframebufferタイプを直接サポートするBGRAピクセルフォーマットおよびパックされたピクセルフォーマット
- ModelView行列によって変更された自動的な再測量頂点垂直線。 場合によっては、再測量によって、より高価な再標準化操作は代わることができます。
- specularのアプリケーションは、よりリアルな照明効果のために織った後に強調表示します
- 織る間に境界とイメージtexelsを混合することを避けるために、同等なエッジ固定を織ってください
- mipmapのための詳細コントロールのレベルは、レベルのサブセットだけをロードすることを許すために織ります。 織られたオブジェクト ビューアから遠い のため高解像度テクスチャーイメージが必要ではない時には、これはテクスチャーメモリーを保存することができます。
- 1回の操作においてそのサブ範囲から配列のサブ範囲と引き幾何学を指定する頂点配列向上。 これは、前変換,キャッシュ変換された幾何学などさまざまな最適化を許します
- ARB-承認された拡張の概念。 最初のそのような拡張は、GL_ARB_imaging、2D画像処理のために意図されている画像処理サブセットとして集合的に知られている機能のセットです。 この機能が入手可能であるかどうかをわかるために、拡張ストリングをチェックしてください。
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はgl.hのための置換であらず、それは補足です。 それは、インタフェースを、すでにプラットフォーム具体的なgl.hにより定義されていなかったすべての拡張に提供します。 これが、複数のグラフィックスドライバー where 中心的なソース(からのgl.h をサポートするプラットフォームに必要である 例えば マイクロソフトまたはXFree86)は、より頻繁にアップデートされたベンダドライバーから提供された機能を追跡できません。