SDLでOpenGL
2004年8月23日さて、先日書いた「SMPEGでOpenGL」について、Windowsでは、OpenGLを起動したスレッド以外のスレッドで呼び出すと、wglMakeCurrentでのデバイスコンテキストの取得ができず、画面の更新ができないという問題であった。
それならば、起動したスレッド以外のスレッドで呼び出さなければいいではないか…というわけで、以下のように別スレッドで動作するコールバック内ではフラグの設定のみをし、イベントループ内で更新を行うように書き換えた。
int movie_update = 0 ;
// イベントループ内で
if ( (bool)movie_update == true ) {
glmovie_draw( (GLubyte*) movie_surface->pixels );
SDL_GL_SwapBuffers();
movie_update = false ;
}
// 設定したコールバック
static void glmpeg_update( SDL_Surface* surface, Sint32 x, Sint32 y, Uint32 w, Uint32 h )
{
movie_update = true ;
movie_surface = surface ;
}
これで、きちんとSDLとOpenGLを併用してもMpeg再生ができるようになった。よかった。苦労した分、喜びは大きいです。
ちなみに、smpegの描画先サーフェースは、画面にではなく、OpenGLのテクスチャ上に描画すること。じゃないと、エラーで終了してしまうので注意が必要です。
それならば、起動したスレッド以外のスレッドで呼び出さなければいいではないか…というわけで、以下のように別スレッドで動作するコールバック内ではフラグの設定のみをし、イベントループ内で更新を行うように書き換えた。
int movie_update = 0 ;
// イベントループ内で
if ( (bool)movie_update == true ) {
glmovie_draw( (GLubyte*) movie_surface->pixels );
SDL_GL_SwapBuffers();
movie_update = false ;
}
// 設定したコールバック
static void glmpeg_update( SDL_Surface* surface, Sint32 x, Sint32 y, Uint32 w, Uint32 h )
{
movie_update = true ;
movie_surface = surface ;
}
これで、きちんとSDLとOpenGLを併用してもMpeg再生ができるようになった。よかった。苦労した分、喜びは大きいです。
ちなみに、smpegの描画先サーフェースは、画面にではなく、OpenGLのテクスチャ上に描画すること。じゃないと、エラーで終了してしまうので注意が必要です。
コメント