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

SDLDoc-ptBR/Usando_OpenGL_com_SDL (last edited 2008-04-17 08:18:41 by localhost)