Usando OpenGL com SDL
SDL tem a habilidade de criar e usar contextos OpenGL em várias plataformas(Linux/X11, Win32, BeOS, MacOS Classic/Toolbox, Mac OS X, FreeBSD/X11 e Solaris/X11). Isto permite a você, usar o áudio de SDL, tratamento de eventos, threads e temporizadores em suas aplicações OpenGL (funções freqüentemente oferecidas pela GLUT).
Inicialização
Iniciar SDL para usar OpenGL não é muito diferente do que iniciar SDL normalmente. Existem três diferenças; você deve passar SDL_OPENGL para SDL_SetVideoMode, você deve especificar alguns GL attributes (tamanho da profundidade do buffer, tamanho dos buffers) usando SDL_GL_SetAttribute e finalmente, se você deseja usar bufferização dupla você deve especificar isso como um GL attribute, não pela passagem da flag SDL_DOUBLEBUF para SDL_SetVideoMode.
Exemplo 2-7. Iniciando SDL com OpenGL
/* Informações sobre as configurações do vídeo. */
const SDL_VideoInfo* info = NULL;
/* Dimensões de nossa janela. */
int width = 0;
int height = 0;
/* Profundidade de cores de nossa janela. */
int bpp = 0;
/* Parâmetros (flags) que passaremos para SDL_SetVideoMode. */
int flags = 0;
/* Primeiro, iniciamos o subsistema de vídeo da SDL. */
if( SDL_Init( SDL_INIT_VIDEO ) < 0 ) {
/* Se falhar, sai. */
fprintf( stderr, "A inicialização de video falhou: %s\n",
SDL_GetError( ) );
quit_tutorial( 1 );
}
/* Vamos pegar algumas informações sobre o vídeo. */
info = SDL_GetVideoInfo( );
if( !info ) {
/* Provavelmente isto nunca irá acontecer. */
fprintf( stderr, "A consulta ao vídeo falhou: %s\n", SDL_GetError( ) );
quit_tutorial( 1 );
}
/*
* Estabelecemos nossa largura/altura para 640/480 (você poderá
* é claro, deixar o usuário decidir isto em uma aplicação
* normal). Nós obteremos o bpp dos dados que obtivemos do vídeo.
* No X11, o modo de vídeo não pode mudar sua resolução, então,
* isto é provavelmente muito seguro.
* Sob o Win32, ChangeDisplaySettings pode mudar sua bpp.
*/
width = 640;
height = 480;
bpp = info->vfmt->BitsPerPixel;
/*
* Agora, queremos instalar nossos pedidos
* de atributos de janela, para nossa janela
* OpenGL. Queremos *ao menos* 5 bits de
* vermelho, verde e azul. Também queremos
* ao menos 16-bit de profundidade do buffer.
*
* A ultima coisa que faremos é pedir uma
* janela com bufferização dupla. '1' ativa a
* buferização, '0' desativa a buferização.
*
* Note que não usamos SDL_DOUBLEBUF nas
* flags passadas para SDL_SetVideoMode.
* Aquilo não tem efeito nos atributos de estados
* de GL, apenas na configuração padrão de blit 2D.
*/
SDL_GL_SetAttribute( SDL_GL_RED_SIZE, 5 );
SDL_GL_SetAttribute( SDL_GL_GREEN_SIZE, 5 );
SDL_GL_SetAttribute( SDL_GL_BLUE_SIZE, 5 );
SDL_GL_SetAttribute( SDL_GL_DEPTH_SIZE, 16 );
SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 );
/*
* Nós queremos que a SDL nos providencie uma
* janela OpenGL, num modo de vídeo de tela
* cheia.
*
* EXERCÍCIO:
* Faça iniciar no modo janela, e trate
* os eventos de redimensionamento
* corretamente com glViewport.
*/
flags = SDL_OPENGL | SDL_FULLSCREEN;
/*
* Estabelece o modo de tela
*/
if( SDL_SetVideoMode( width, height, bpp, flags ) == 0 ) {
/*
* Isto pode acontecer por vários motivos,
* incluindo o VÍDEO não ser fixado, a resolução
* especificada não estar disponível, etc.
*/
fprintf( stderr, "Falha ao estabelecer modo de vídeo: %s\n", SDL_GetError( ) );
quit_tutorial( 1 );
}
Desenho
Tirando a inicialização, usar OpenGL com SDL é o mesmo que usar OpenGL com qualquer outra API, como GLUT, Você continua usando todas as mesmas chamadas de função e tipos de dados. Entretanto se você estiver usando bufferização dupla , então você terá que usar SDL_GL_SwapBuffers() para trocar os buffers e atualizar o vídeo. Para solicitar bufferização dupla com OpenGL, use SDL_GL_SetAttribute com SDL_GL_DOUBLEBUFFER, e use SDL_GL_GetAttribute para verificar se ela está definida atualmente.
A listagem completa de um exemplo é apresentada a baixo.
Exemplo 2-8. SDL e OpenGL
