2013-07-08 36 views
5

OpenGL 2.0以上に依存するプログラムを作成しています。 GL 2.0の仕様を見ると、ARB_shader_objectsで定義されている拡張が昇格されていることがわかります.ARBプレフィックスはGLバージョン2.0以上では必要なくなり、> GL2.0をサポートする実装ではこれをコアの実装。GL_GLEXT_PROTOTYPESの定義と関数ポインタの取得の比較

私のプログラムをコンパイルすると、Linux上でgccが警告:暗黙の関数宣言を行うと言われています。これらの関数を取得する1つの方法は、プログラム自体でそれらを宣言し、* GetProcAddress関数を介して関数ポインタを取得することです。

もう1つの方法は、glext.hをインクルードする前にGL_GLEXT_PROTOTYPESを定義して、デフォルトでGL2.0以上に存在する各関数の関数ポインタを取得する問題を回避することです。誰かがそれが推奨され、正しい方法であることをお勧めしますか?ベースラインは私のプログラムがOpenGL 2.0以上を必要としており、私はGL2.0以下をサポートしたくありません。

誰かがgleeやglewの使用を提案した場合、私は同じ目的を達成するためにgleeライブラリやglewライブラリを使用するオプションを使用することは望んでいません。

答えて

8

ここには2つの問題があります。

GL_ARB_shader_objects実際にはGL2.0ではコアに昇格されましたが、コアバージョンではAPIがわずかに変更されています。したがって、ARB接頭辞が付いていない関数名だけではありません。 glCreateShaderObjectARB()の代わりにglCreateShader()があり、の代わりにの2つのファンクションglGetShaderInfoLog()glGetProgramInfoLog()があります。

第2の問題は、GLライブラリがすべて コア機能をエクスポートすることを前提としています。 Linuxでは、通常は(コア機能だけでなく、基本的にすべてのもの)ケースですが、それを保証する標準はありません。 OpenGL ABI for Linuxには、次のものが必要です。

3.4。ライブラリは、すべてのOpenGL 1.2、GLU 1.3、GLX 1.3、およびARB_multitextureエントリポイントを静的にエクスポートする必要があります。

proposals for an updateがありますが、私は最近それについて何も聞いていません。

WindowsはOpenGL 1.1コアをエクスポートします。これは、OpenGL32.dllがOSの一部であり、ICDが別のDLLにあるためです。あなたは関数ポインタを事実上全て検索しなければなりません。

あなたが手作業で行ったり、glewのようなライブラリを使用したりしても、最も移植性の高い方法で確実に検索できます。

+0

IIRC Vista以上で1.4をエクスポートして状況を少し改善* 1.4。 – genpfault

+1

@genpfault:いいえ、そうではありません。 Vistaでは、デフォルトの1.1レンダラにswラスタライザの代わりにD3Dを使用していますが、そうでない場合でも同じです。 GL1.1は単にWin32 APIの一部であり、更新されたことはありません。 – derhass

+0

GL_EXT_PROTOTYPESを定義し、それらのすべてに対してGetProcAddressを実行せずに関数を使用するのはどうですか?それはお勧めではありませんか?そうでなければ、なぜそれはglextヘッダーの一部ですか?さらに、GetProcAddressを常に実行しなければならないコア機能については、それらをコア機能として宣伝する目的は何ですか? – Divick

関連する問題