OpenGLで拡張機能を使用した(OpenGL拡張を使用して)

月曜日〜金曜日、日、時間の更新の午前7時北京時間 -

本書に示されている例はすべて、これまでのところ(これまでの例は、標準のOpenGLのコアに基づいています)のOpenGLのコア機能に頼ってきた。しかし、OpenGLのの最大の強みの一つは、それが拡張され、によって高めることができるということですハードウェアメーカー、オペレーティングシステムのベンダー、およびツールやデバッガのも、発行者(APIの拡張機能は、しかし、いくつかのユニークな機能があるには、標準APIの存在しないだろうに、ハードウェアベンダーの一部である)。拡張子は上の多くの異なる効果を持つことができますOpenGLの機能(これらの特性の拡張は非常に異なる効果をもたらしうる)

拡張子は、OpenGLのコアバージョン(拡張子はAPIのコアバージョンにその追加の補数を意味する)のいずれかの追加です。ExtensionsがOpenGLのWebサイト(OpenGLのWebサイトに表示され展開されたリスト)上のOpenGL拡張レジストリに記載されています。これらの拡張がこれらの拡張機能は、OpenGLの規格の特定のバージョンの実装と一致しないことがある(OpenGLの仕様の特定のバージョンとの違いのリストとして書かれた、およびOpenGLのバージョンが何であるかに注意している、あなたは、OpenGL拡張のバージョンに注意を払う必要があります拡張子)。拡張子のテキストはそれを言うことです(拡張子がサポートされている場合はコアOpenGLの仕様が変更されなければならない方法を説明し、あなたが拡張する場合、)拡張は、OpenGLのどうなるのか理解し始めた説明を意味している。しかし、人気があり、一般的に便利な拡張機能は、通常は(しかし、多くの便利な拡張機能は、一般的に、最終的にコア基準になります)のOpenGLのコアバージョンに「昇格」されているので、あなたは、OpenGLの最新かつ最高のバージョンを実行している場合、そこコアプロファイル(つまり、これらの拡張子の前にOpenGLの時間の最新バージョンにすべての更新が存在しない可能性の興味深いが、一部ではない、多くの拡張機能ではないかもしれませんが、OpenGLの新しいバージョンに含まれていました。のOpenGLの各バージョンと、彼らが何をすべきかについての簡単な概要に昇格された拡張子の完全なリストは、付録Cに含まれている「OpenGLの機能とバージョン。」)で標準(拡張子とその関連の完全なリスト付録Cに記載されている情報)

ベンダー、EXT、およびARB(三つの主要な機能拡張があります:メーカー、EXT、ARB)は拡張子の三の大分類があります。ベンダー拡張は、1つのベンダーのハードウェア上で書かれており、実装されている(拡張ベンダーは、メーカー独自のハードウェアで実装されています)特定のベンダーを表す。イニシャルは通常、拡張子アドバンスト・マイクロ・デバイスまたはNVIDIAのための「NV」の名 - 「AMD」の一部である、例えば(通常は達成表現は、アドバンスト・マイクロ・デバイスの代わりにAMDなど、ベンダーの名前が含まれています、NV)は、NVIDIAを表します。(また、特にその拡張子た場合、メーカーの拡大の達成とベンダーの数があるかもしれない、それが広く受け入れられている状態になる場合は特に、複数のベンダーが特定のベンダー拡張をサポートするかもしれないという可能性であります広く)時間を受け入れた。EXT拡張子は(EXT拡張子が二つ以上の企業が実施された拡張機能です)二つ以上のベンダーが一緒に書かれている。他のベンダーが興味を持っているなら、彼らは多くの場合、ベンダー固有の拡張機能として、自分たちの生活を始めるが、 EXTENを実装 シオン、おそらくマイナーな変更と、

この拡張プロセスは!エクステンションの何百人もが現在利用可能である。(ただ拡張プロセスを促進聞いて始めて、彼らは疑問に思うかもしれません)最初は混乱に聞こえるかもしれないが(拡張子の何百人もが使用できるようになりました)しかし、OpenGLのの新しいバージョンがあります多くの場合、プログラマは(新しいOpenGLのバージョンは、多くの場合、便利な拡張機能で構成されている)有用であることが分かってきた。このように、各拡張子は太陽の下でその時刻を取得します(このように、それぞれが太陽を見るの拡張子を持つ拡張子から構築ある日)輝くものは(これらの非常に巨根拡張に行きコアOpenGLの標準に入れられます)コアに昇格させることができ、あまり有用なものは、それが考慮されません非常に実用的なものを(ないとは見なされません)。この「自然淘汰」プロセスは、(自然淘汰が最も有用かつ最も重要な新機能をフィルタリングするために助けることができる)だけ最も有用かつ重要な新機能は、OpenGLのコアバージョンにそれを作ることを確認するのに役立ちます

お使いのコンピュータのOpenGLの実装でサポートされている拡張子を決定するための便利なツールがREALTECH VRのOpenGLの拡張機能ビューアです。拡張からREALTECH VRのWebサイトを意味し、自由に利用可能である(図3.6を参照)(お使いのコンピュータを検出することができますREALTECHと呼ばれるサポートしています図3.6に示すVRのOpenGLの拡張機能ビューアは、それは)無料です
OpenGLで拡張機能を使用した(OpenGL拡張を使用して)

拡張機能とOpenGLを強化(拡張強化のOpenGL)

任意の拡張子を使用する前に、(サポートされている拡張機能を使用する前に、あなたは、この拡張機能は、現在お使いのデバイス上で実行されているかを決定する必要があります)、彼らはあなたのアプリケーションが実行されているOpenGLの実装によってサポートされていることを確認する必要があります。 、まず、あなたが使用できる2つの機能がありますが、OpenGLがサポートしている拡張モジュールをどの見つけるために、サポートの拡張機能の数を決定するために、あなたはglGetIntegervを流れる電流を得るために、GL_NUM_EXTENSIONSパラメータ(することができます、*)とglGetIntegerv()を呼び出すことができます(GL_NUM_EXTENSIONSスケーラブルな環境のサポートの数が)。次の、あなたは(そして、あなたが出て、各拡張子の名前を取得するには、次のAPIを使用することができます)を呼び出すことによってサポートされる機能拡張のそれぞれの名前を見つけることができます

constのGLubyte * glGetStringi(GLenum名、GLuintインデックス);

名前パラメータとしてGL_EXTENSIONSを通過し、そして0と1のインデックスでサポートされている拡張機能の数未満の値すべきである(GL_EXTENSIONSに渡される最初の引数は、第2のパラメータは、最初のいくつかの拡張機能は、この値は前のステップ未満であります取得した内線番号)。関数は、特定の拡張機能がサポートされている場合、あなたは、単に拡張子の数を照会することができます参照してください。(この機能は、拡張の名前を返します)、文字列として拡張子の名前を返し、その後をループそれぞれが(拡張子がサポートされているかどうかを知るためには、あなたが最初にすべての拡張機能名を取得することができ、その後、あなたが調べたい1がある場合、そこに名前を探してください)拡張機能をサポートし、あなたが探しているものにその名を比較します。本のソースコードはあなたのためにこれを行う簡単な関数(このコースでは、我々はそのような方法をカプセル化)が付属しています。sb7IsExtensionSupported()は、(以下に定義するその名のsb7IsExtensionSupported、関数)のプロトタイプを持っています

int型sb7IsExtensionSupported(のconst char型*のEXTNAME)。

照会された場合、この関数は、ヘッダで宣言され、拡張の名前をとり、それは(この関数はsb7ext.hで宣言されていない場合、それが現在のOpenGLコンテキストとゼロに支持されている場合に非ゼロを返す、拡張サポートされ、ゼロ以外の戻り、それ以外の場合は0)。あなたのアプリケーションは、常に(あなたのプログラムは、あなたが拡張機能がサポートされているかどうかをチェックする前に拡張を使用したい)あなたがそれらを使用する前に、使用したい機能拡張のためのサポートを確認する必要があります

拡張機能は、一般的に(通常のOpenGLに追加する4つの方法のいくつかの組み合わせによって拡張)4つの異なる方法のいくつかの組み合わせでのOpenGLに追加します。

彼らはありませんでした物事の法的作ることができるだけでOpenGLの仕様から制約を除去することで、前に。( 彼らは、OpenGLの数は、前の不法な物事が合法的になり制限することによって除去することができる)
彼らができるか、その可能な値の拡張範囲でトークンを追加します既存の関数にパラメータとして渡される。 ( 既存の機能、許容されるパラメータまたはトークンの広い範囲に対する)
それらは機能が追加するGLSLを拡張することができ、組み込み関数、変数、またはデータタイプ(それらは追加することができ機能、内蔵されたデータの変数またはどのタイプGLSLを強化するために)
彼らはへの関数は(彼らは、OpenGLのための新しい機能を追加しました)全く新しい新しいOpenGLの自分自身を追加することができます
(拡張子がサポートされていると判断したら、もちろん、)一度、もはやエラーと考えられていた事は、アプリケーションがほかに、新たに許可される行動を使用して起動何もする必要はありませんされている最初のケースでは、(最初​​の場合、以前に)新しい動作が許可される使用に加えて、あなたはあなたのプログラムを変更する必要はありません、適切になるために間違ったコールであると考えられている。同様に、第2のケースのために、あなただけの新しいトークン値を使用して起動することができます関連する機能は、あなたがそれらの値を(あなたは、これらのパラメータを持っている場合は同様に、第二のケースのために、あなたはAPIに関連する新しいパラメータを使用して始めることができます)持っていると仮定。トークンの値は、拡張仕様であり、彼らはあなたのシステムのヘッダファイルに含まれていない場合ので、あなたがそこにそれらを調べることができます。(あなたは、ヘッダー・ファイル・システムの場合には見つけることができない場合は、拡張ドキュメントでこれらのパラメータ)

GLSLでの拡張の使用を有効にするには、まずあなたがそれらの拡張機能を使用するために、その機能(GLSLを必要としているコンパイラに伝えるためにそれらを使用するシェーダの先頭に行を含める必要があり、あなたはGLSLに指示する必要がありますコンパイラ、あなたがそれらの機能を使用する必要がある)。例えば、GLSLで仮想のGL_ABC_foobar_feature拡張を有効にするには、あなたのシェーダの先頭に以下のものを含む(例えば、GL_ABC_foobar_feature拡張子を使用して、あなたはあなたのシェーダで次のように記述する必要がありますこの文):

#extensionのGL_ABC_foobar_feature:有効

これはあなたのシェーダで拡張子を使用するコンパイラに指示します(これは、シェーダでこの機能を使用するコンパイラに指示します)。コンパイラは、拡張子を知っているならば、それはあっても、あなたがシェーダをコンパイルできるようになります基盤となるハードウェアが。この場合、コンパイラは警告を発行する必要があり、それは見ている場合(コンパイラは、この機能を知っている場合、基盤となるハードウェアがサポートされていない場合でも、コンパイラは正しいGPUプログラムをコンパイルすることができます)機能をサポートしていません。 (一般的に言えば拡張子が実際に。一般的に、GLSLへの拡張は、その存在を示すために、プリプロセッサトークンを追加します(このような場合には、この機能が実際にシェーダを使用した場合、その後、コンパイラは警告する必要があります)使用されていることを、GLSL膨張)は、それらの性能を決定するために、前処理が行われる。例えば、GL_ABC_foobar_featureは暗黙的に)、例えばGL_ABC_foobar_featureを暗黙的に含まれる(含まれます

GL_ABC_foobar_feature 1つの#define
これは、次のような書き込みをコーディングすることができることを意味は、(この文を使用すると、以下のコードを書くことができることを示しています)

#if GL_ABC_foobar_feature
//使用foob​​arの拡張子から機能
の#else
//エミュレートまたはそれ以外の場合は不足している機能を回避する
#endifの
これはあなたが条件付きでコンパイルするか、または基礎となるでサポートされていてもいなくてもよい拡張の一部である機能を実行することができますOpenGLの実装。あなたのシェーダは絶対に拡張のサポートを必要とし、それなしでは全く動作しません場合は、代わりにこのより強引なコードを含めることができます。

GL_ABC_foobar_featureの#extension:必要と
する場合は、シェーダでウィル失敗で、その後IT、GL_ABC_foobar_feature延長でのOpenGLの実装のサポートではないとGL_ABC_foobar_featureはOpenGLを達成した場合#extension指令(に含む線路でAN ONコンパイルエラーにレポート拡張をサポートしていない、シェーダコンパイラ失敗し、エラーの性質を報告)。実際には、GLSLの拡張がされますオプトイン機能、およびアプリケーションは、彼らが使用する予定の拡張機能前までのコンパイラを伝える必要があります( 実際にはGLSLの拡張子は、選択のプロパティで、アプリケーションがすべき)は、使用を拡大したいのか、コンパイラに指示します

次は、ほとんどのプラットフォームでは、あなたがOpenGLドライバと拡張機能に直接アクセスすることはできません。(次に、私たちはこれらの拡張子を見てOpenGLのための新たな機能を追加)のOpenGLに新しい機能を導入拡張にしていない来ますただ魔法のように呼び出すアプリケーションにとして利用できる見える(あなたが直接のOpenGLドライバにアクセスすることはできません、ほとんどのプラットフォームで、拡張子はとても不思議な機能ではありません直接、あなたのプログラムにアクセスすることができます)。むしろ、あなたはOpenGLドライバを依頼する必要がありますあなたが呼び出したい関数を表す関数ポインタのための関数ポインタは、通常、(;.関数ポインタは、一般的に二つの部分で宣言されている(詳細は、あなたが訪問したい関数へのポインタへのOpenGLドライバを見つける必要があるということです)二つの部分として定義される)最初の関数ポインタ型ofthe定義であり、第二は、関数ポインタ変数自体である。(第一の部分はポインタ型の関数である、第2の部分は、関数ポインタそのものである)は、このコードを検討します一例)は、例えば以下:(します

typedefは、ボイド
(APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKPROC)(グレンモード、それGLuint)。
PFNGLDRAWTRANSFORMFEEDBACKPROC glDrawTransformFeedback = NULL;
これはGLenumとGLuintパラメータ(PFNGLDRAWTRANSFORMFEEDBACKPROCこれは、関数ポインタの種類を定義し、この関数はパラメータGLenumとGLuintを受け入れる)を取る関数へのポインタとしてPFNGLDRAWTRANSFORMFEEDBACKPROCタイプを宣言する。次に、それのインスタンスとしてglDrawTransformFeedback変数を宣言しますこのタイプは、(それがその後、関数ポインタ型の実際の変数を定義します)。実際には、多くのプラットフォーム上で、glDrawTransformFeedback()関数の宣言は同じように、実際には、多くのプラットフォーム上で(ちょうどこのように実際にありますこれを示す、glDrawTransformFeedbackが)そのように定義されている。これはかなり複雑なようだが、幸い、次のヘッダファイルが非常に見える関数プロトタイプのすべての宣言、関数ポインタ型、およびすべての登録されたOpenGL拡張によって導入されたトークンの値を(含めます錯体が、幸いにも、このヘッダーファイルを次する関数、関数ポインタ、およびパラメータのこれらのタイプ)のすべてのタイプを定義します。

#include
の#include
の#include
これらのファイルは、AT。glext.hヘッダーは、標準の両方含まれています(これらは、ウェブサイトのOpenGL拡張に見つけることができます)OpenGLの拡張レジストリのWebサイトで見つけることができます OpenGL拡張と多くのベンダー固有のOpenGL拡張(glextを。 Hは、標準のOpenGL拡張および膨張の多くのメーカー)を含む、wglext.hヘッダは数含ま wglext.h、Windowsの特定の(ある拡張機能のWindowsの拡張のサポートも含まれる)を、そしてglxext.hヘッダは、定義を含みますXの特異的である(glxext.h拡張がXを含み、Xは、UNIXまたはLinuxのウィンドウシステムを指す)(Xが使用ウィンドウシステムであり 、Linuxおよび他の多くのUNIX誘導体および実装に)

本のアプリケーションフレームワークは、ヘッダファイルで宣言されている便利な機能(この本の中にこれらの複雑さをアップラップ拡張関数のアドレスを問い合わせるための方法は、実際にプラットフォーム固有の(クエリ拡張機能へのアクセスアドレスはプラットフォームによって異なります)です。これらの方法は、関数sb7GetProcAddress()フレームに入っsb7ext.hの機能を充填している)は、以下のように定義されるsb7GetProcAddressと呼ばれるこのプロトタイプ(関数など)を有します。

sb7GetProcAddress(のconst char型の funcnameに);
ここで、funcnameには、あなたが幅=戻り値はのアドレスです(ここではfuncnameには、拡張機能の名前です)を使用したいtdの拡張機能での名前にありそうでない場合は、サポートされています場合、機能、およびNULLを。 (拡張子がサポートされている場合、関数はそれ以外の場合はNULLを返し、関数のアドレスを返します)。OpenGLが返された場合でも 、使用したい拡張の一部だ機能の有効な関数ポインタを、それが(拡張子が存在しているという意味ではありませんでもOpenGLは合法的な関数ポインタを返し、それは)拡張があるという意味ではありませんだけ延長した。時々 、同じ機能は一部です (複数の拡張子の、そして時には現在の拡張機能の部分的な実装が付いている船のドライバをベンダーが複数の拡張子がの一部、および拡張の一部を達成するために、時には唯一のベンダー)ものと同じ機能。常に拡張機能のサポートを確認する正式なメカニズムやsb7IsExtensionSupported()関数を使用して( 拡張を使用する前に必ずチェックするようにしてください )拡張機能がサポートされるかどうか。

この日の翻訳は〜さようなら、明日お会いし、ここで取得します

おすすめ

転載: blog.51cto.com/battlefire/2423680