質問

私は、WindowsのDev-C ++でライブラリを再構築しようとしていました。ただし、その間に追加したシェーダー機能はサポートされていません。コンパイラは関連する関数(:: glCreateShader()、:: glCreateProgram()など)を見つけることができませんでした

インターネットとDev-C ++フォルダーを調べてみると、OpenGLの実装(gl.h)はv1.1のみであることがわかりました。 推奨事項を見つけて、 SGI 。 gl3.hを見つけましたが、綿密な調査の結果、gl.hはプロジェクトに含まれていないことに気付き、SDL / SDL_opengl.hを確認する必要があります。

編集: SDL_opengl.hはgl.hをインクルード し、問題の関数のプロトタイプを宣言します。質問は、なぜリンカエラーではなくコンパイル時エラーを与えたのですか?

(私のライブラリはmingw32、libOpenGL32、libSDL、libSDL_Image、libSDL_Mixerにのみリンクします。OSXの場合とまったく同じです(もちろんmingw32を除く)。問題はありませんでした。)

Dev-C ++およびSDLでOpenGL v2.0シェーダーを使用するにはどうすればよいですか?

役に立ちましたか?

解決

gl.hはOpenGL 1.1専用です(使用しているファイルのバージョンとオペレーティングシステムに応じて、場合によっては1.3まで)。それ以外の場合は、さらに glext.h およびおそらく glxext.h (Linux / Unix)または wglext.h (Windows)。

OpenGLの新しいバージョンのすべての関数は、実行時にリンクする必要があります。したがって、それらを使用するには、正しい関数アドレスを取得し、それを関数ポインターに割り当てる必要があります。これを行う最も簡単な方法は、 GLEW のようなものを使用することです。

手動の方法は次のようになります。

PFNGLCREATESHADERPROC glCreateShader = NULL;
glCreateShader = (PFNGLCREATESHADERPROC) wglGetProcAddress("glCreateShader");

またはLinuxの場合:

PFNGLCREATESHADERPROC glCreateShader = NULL;
glCreateShader = (PFNGLCREATESHADERPROC) glXGetProcAddress((GLubyte*) "glCreateShader");

glext.hをインクルードする前にGL_GLEXT_PROTOTYPESを定義する場合、最初の行を省略できます。

編集: SDL_opengl.hにはglext.hのコピーが含まれているようです(ただし、最新ではありません)。したがって、それを使用する場合、上記はまだ有効であるはずです。別のglext.hを使用する場合は、SDL_opengl.hを含める前にNO_SDL_GLEXTを定義する必要があります。また、GL_GLEXT_PROTOTYPESが定義されていないか、自分で作成している限り、関数プロトタイプは使用できません。

EDIT2: SDLには、 SDL_GL_GetProcAddressという独自のGetProcAddress関数があるようです。 a>。

他のヒント

実行時に関数のアドレスをロードできますか?

typedef GLhandle (APIENTRYP PFNGLCREATESHADERPROC) (GLenum shaderType);
PFNGLCREATESHADERPROC glCreateShader = NULL;
glCreateShader = (PFNGLCREATESHADERPROC)wglGetProcAddress("glCreateShader");

typedef GLhandle (APIENTRYP PFNGLCREATEPROGRAMPROC) ();
PFNGLCREATEPROGRAMPROC glCreateProgram = NULL;
glCreateProgram = (PFNGLCREATEPROGRAMPROC)wglGetProcAddress("glCreateProgram");
scroll top