Using OpenGL extensionsに関するこの質問に関連して、これらの拡張関数の目的は何ですか? なぜそれらを使用したいのですか?さらに、それらの使用に関連するトレードオフや落とし穴はありますか?
3 に答える
OpenGL 標準により、個々のベンダーは、新しいテクノロジーが作成されたときに拡張機能を使用して追加機能を提供できます。拡張機能は、新しい関数と新しい定数を導入する場合があり、既存の OpenGL 関数の制限を緩和または削除する場合があります。
各ベンダーには、新しい関数と定数の命名に使用されるアルファベットの略語があります。たとえば、NVIDIA の略語 (NV) は、独自の関数 glCombinerParameterfvNV() および定数 GL_NORMAL_MAP_NV の定義に使用されます。
複数のベンダーが同じ拡張機能の実装に同意する場合があります。その場合、略語 EXT が使用されます。さらに、Architecture Review Board が拡張機能を「祝福」することもあるかもしれません。その後、標準拡張機能として知られるようになり、略語 ARB が使用されます。最初の ARB 拡張機能は GL_ARB_multitexture で、バージョン 1.2.1 で導入されました。公式の拡張プロモーション パスに従って、マルチテクスチャリングはオプションで実装される ARB 拡張機能ではなくなりましたが、バージョン 1.3 以降、OpenGL コア API の一部となっています。
拡張機能を使用する前に、プログラムはまずその可用性を判断し、拡張機能が定義する新しい関数へのポインターを取得する必要があります。これを行うメカニズムはプラットフォーム固有であり、プロセスを簡素化するために GLEW や GLEE などのライブラリが存在します。
OpenGL 拡張機能は、 OpenGL 仕様に追加された新しい機能であり、OpenGL 標準化団体およびさまざまなグラフィック カード ベンダーによって追加されています。これらは、新しい関数呼び出しまたは変数としてプログラマーに公開されます。OpenGL 仕様のすべての新しいバージョンには、より新しい機能が含まれており、(通常) 以前の機能と拡張機能がすべて含まれています。
OpenGL 拡張に関する実際の問題は、Windows にのみ存在します。Microsoft は、OpenGL v1.1以降にリリースされた拡張機能をサポートしていません。グラフィックス カードのベンダーは、ヘッダー ファイルとライブラリを通じてこの機能の独自のバージョンを出荷することで、これを克服しています。ただし、リンク先の質問が示すように、これを使用するのは少し面倒です。しかし、この問題は、これらすべてを使いやすいパッケージにまとめて処理するGLEWの人気によってほとんどなくなりました。
ごく最近の OpenGL 拡張機能を使用する場合は、古いグラフィック ハードウェアではサポートされていない可能性があることに注意してください。これ以外に、これらの拡張機能を使用することによるその他の欠点はありません。標準になる拡張機能のほとんどは非常に便利であり、それらを使用しない論理はほとんどありません。
一般に、拡張機能は、グラフィック カード ベンダーが OpenGL 仕様の次のリビジョンまで待たずに新しい機能を OpenGL に追加する方法です。拡張機能にはさまざまな種類があります。
- ベンダー拡張 - 特定のタイプの機能を提供するベンダーは 1 つだけです。
- 例:
NV_vertex_program
- 例:
- マルチベンダー拡張 - 複数のベンダーが集まり、機能について合意しました。
- 例:
EXT_vertex_program
- 例:
- ARB 拡張機能 - OpenGL Architecture Review Board は拡張機能を承認しました。このタイプの拡張機能がしばらくの間存在することを期待するのは合理的です。
- 例:
ARB_vertex_program
- 例:
拡張機能は、これらのすべての手順を実行する必要はありません。ハードウェア設計が別の方向に進み、拡張機能が放棄される前に、拡張機能が 1 つのベンダーによってのみ実装されることがあります。また、誰もがより良い方法があると判断する前に、拡張機能が ARB ステータスまで到達する場合もあります。(ARB_vertex_program
たとえば、このアプローチは、ARB_vertex_shader
シェーダーをコア OpenGL 仕様に組み込む時期が来たときに、高レベルのシェーディング言語アプローチを支持して脇に置かれました。) ARB 拡張機能でさえ、永遠に続くわけではありません。ARB_matrix_palette
たとえば、今日は を必要とするものは書きません。
以上のことから、拡張機能、特に最新の ARB および EXT 拡張機能を最新の状態に保つことは非常に良い考えです。これまで、ハードウェアを介した「高速パス」の一部は、拡張機能を介してのみアクセス可能でした。同様に、ハードウェアの一部が実行できるすべての機能を知りたい場合は、ベンダー固有の拡張機能を見るのに最適な場所はありません。
OpenGL を使い始めたばかりの場合は、以下を調査することをお勧めします。
ARB_vertex_buffer_object
(頂点)ARB_vertex_shader
//ARB_fragment_shader
/ARB_shader_objects
GLSL 仕様 (シェーダー)
より高度な:
ARB/EXT_framebuffer_object
(オフスクリーン レンダリング)
これはすべてコアに組み込まれた機能ですが、その境界がどこにあるのかをよりよく理解できるように、分離して見るのが良い場合があります。(コア OpenGL 仕様は古いものと新しいものをシームレスに混合するため、高速パスにとどまり、レガシーを回避し、ソフトウェア パスに実装する場合は、これが非常に重要になる可能性があります。)
何をするにしても、使用することを決定した拡張機能の適切なチェックと、必要な場合のフォールバックがあることを確認してください。カードに特定の拡張機能がある場合でも、その拡張機能が別のベンダーのカードに存在するという保証はなく、同じカードを使用する別のオペレーティング システムにも存在するという保証はありません。