NAME
SDL::Cookbook::OpenGL - 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 40 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 "";}
SEE ALSO
perl SDLx::App OpenGL
AUTHORS
See "AUTHORS" in SDL.