SDL::Cookbook::OpenGL(3) Using SDL with OpenGL

CATEGORY

Cookbook

DESCRIPTION

As of release 2.5 SDL no longer maintains it's own bindings of OpenGL. Support for OpenGL has been moved over to a more mature implementation.

This implementation is the POGL project. OpenGL is faster and more complete; and works with SDL seamlessly.

EXAMPLE

Expanded from Floyd-ATC's OpenGL example.

        use strict;
        use warnings;
        use SDL;
        use SDLx::App;
        use SDL::Mouse;
        use SDL::Video;
        use SDL::Events;
        use SDL::Event;
        use OpenGL qw(:all);

You can use OpenGL as needed here.

        my ($SDLAPP, $WIDTH, $HEIGHT, $SDLEVENT);
        $| = 1;
        $WIDTH = 1024;
        $HEIGHT = 768;
        $SDLAPP = SDLx::App->new(title => "OpenGL App", width => $WIDTH, height => $HEIGHT, gl => 1);
        $SDLEVENT = SDL::Event->new;

SDLx::App can start an OpenGL application with the parameter gl => 1.

        glEnable(GL_DEPTH_TEST);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity;
        gluPerspective(60, $WIDTH / $HEIGHT, 1, 1000);
        glTranslatef(0, 0, -20);

Above we enable GL and set the correct perspective

        while (1) {
          &handlepolls;
          glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
          glRotatef(.1, 1, 1, 1);
          &drawscene;
          $SDLAPP->sync;
        }

For SDLx::App sync handles the GL buffer clean.

        sub drawscene {
          my ($color, $x, $y, $z);
          for (-2 .. 2) {
            glPushMatrix;
            glTranslatef($_ * 3, 0, 0);
            glColor3d(1, 0, 0);
            &draw_cube;
            glPopMatrix;
          }
          return "";
        }
        sub draw_cube {
          my (@indices, @vertices, $face, $vertex, $index, $coords);
          @indices = qw(4 5 6 7   1 2 6 5   0 1 5 4
                        0 3 2 1   0 4 7 3   2 3 7 6);
          @vertices = ([-1, -1, -1], [ 1, -1, -1],
                       [ 1,  1, -1], [-1,  1, -1],
                       [-1, -1,  1], [ 1, -1,  1],
                       [ 1,  1,  1], [-1,  1,  1]);
          glBegin(GL_QUADS);
          foreach my $face (0..5) {
            foreach my $vertex (0..3) {
              $index  = $indices[4 * $face + $vertex];
              $coords = $vertices[$index];
              
              glVertex3d(@$coords);
            }
          }
          glEnd;
          return "";
        }

Below we can use SDL::Events as normal:

        sub handlepolls {
          my ($type, $key);
          SDL::Events::pump_events();
          while (SDL::Events::poll_event($SDLEVENT)) {
            $type = $SDLEVENT->type();
            $key = ($type == 2 or $type == 3) ? $SDLEVENT->key_sym : "";
            if ($type == 4) { printf("You moved the mouse! x=%s y=%s xrel=%s yrel=%s\n", $SDLEVENT->motion_x, $SDLEVENT->motion_y, $SDLEVENT->motion_xrel, $SDLEVENT->motion_yrel) }
            elsif ($type == 2) { print "You are pressing $key\n" }
            elsif ($type == 3) { print "You released $key\n" }
            elsif ($type == 12) { exit }
            else { print "TYPE $type UNKNOWN!\n" }
            if ($type == 2) {
              if ($key eq "q" or $key eq "escape") { exit }
            }
          }
          return "";
        }

AUTHORS

See ``AUTHORS'' in SDL.