Dev-C ++およびSDLを使用したOpenGL v2.0シェーダー?
質問
私は、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");