8

OpenGL 2.0 以上に依存するプログラムを作成しています。GL 2.0 の仕様を見ると、ARB_shader_objects で定義されている拡張機能が昇格されていることがわかります。これは、GL バージョン 2.0 以降では ARB プレフィックスが不要になり、> GL2.0 をサポートする実装ではこれが一部として含まれることを意味すると思います。コア実装。

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

もう 1 つの方法は、glext.h をインクルードする前に GL_GLEXT_PROTOTYPES を定義することです。これにより、現在 GL2.0 以降にデフォルトで存在する各関数の関数ポインターを取得する問題を回避できます。それが推奨される正しい方法であるかどうか、誰かが提案してもらえますか? 基本的に、私のプログラムには OpenGL 2.0 以上が必要であり、GL2.0 未満のものはサポートしたくないということです。

誰かが glee または glew を使用することを提案した場合に備えて、同じことを達成するために glee または glew ライブラリを使用したくない/使用するオプションはありません。

4

1 に答える 1

11

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

GL_ARB_shader_objects確かにGL2.0でコアに昇格されましたが、API はコア バージョン用にわずかに変更されているため、 ARBプレフィックスのない同じ関数名ではありませんglCreateShader()。この種の他の小さな違い。glCreateShaderObjectARB()glGetShaderInfoLog()glGetProgramInfoLog()glGetInfoLogARB()

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

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

アップデートの提案はありますが、最近それについて何も聞いていません。

opengl32.dll は OS の一部であり、ICD は別の dll にあるため、Windows は OpenGL 1.1 コアのみをエクスポートします。そこにある事実上すべての関数ポインターを照会する必要があります。

したがって、最も移植性の高い方法は、手動で行うか glew のようなライブラリを使用するかに関係なく、確実にクエリを実行することです。

于 2013-07-09T18:47:07.597 に答える