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 seemlessly.
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 prespective
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 "";
}