.\" -*- mode: troff; coding: utf-8 -*- .\" Automatically generated by Pod::Man 5.01 (Pod::Simple 3.43) .\" .\" Standard preamble: .\" ======================================================================== .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Vb \" Begin verbatim text .ft CW .nf .ne \\$1 .. .de Ve \" End verbatim text .ft R .fi .. .\" \*(C` and \*(C' are quotes in nroff, nothing in troff, for use with C<>. .ie n \{\ . ds C` "" . ds C' "" 'br\} .el\{\ . ds C` . ds C' 'br\} .\" .\" Escape single quotes in literal strings from groff's Unicode transform. .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" .\" If the F register is >0, we'll generate index entries on stderr for .\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index .\" entries marked with X<> in POD. Of course, you'll have to process the .\" output yourself in some meaningful fashion. .\" .\" Avoid warning from groff about undefined register 'F'. .de IX .. .nr rF 0 .if \n(.g .if rF .nr rF 1 .if (\n(rF:(\n(.g==0)) \{\ . if \nF \{\ . de IX . tm Index:\\$1\t\\n%\t"\\$2" .. . if !\nF==2 \{\ . nr % 0 . nr F 2 . \} . \} .\} .rr rF .\" ======================================================================== .\" .IX Title "pods::SDL::Cookbook::OpenGL 3pm" .TH pods::SDL::Cookbook::OpenGL 3pm 2024-03-28 "perl v5.38.2" "User Contributed Perl Documentation" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l .nh .SH NAME SDL::Cookbook::OpenGL \- Using SDL with OpenGL .SH CATEGORY .IX Header "CATEGORY" Cookbook .SH DESCRIPTION .IX Header "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. .PP This implementation is the POGL project. OpenGL is faster and more complete; and works with SDL seamlessly. .SS EXAMPLE .IX Subsection "EXAMPLE" Expanded from Floyd-ATC's OpenGL example. .PP .Vb 9 \& 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); .Ve .PP You can use OpenGL as needed here. .PP .Vb 1 \& 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; .Ve .PP SDLx::App can start an OpenGL application with the parameter gl => 1. .PP .Vb 5 \& glEnable(GL_DEPTH_TEST); \& glMatrixMode(GL_PROJECTION); \& glLoadIdentity; \& gluPerspective(60, $WIDTH / $HEIGHT, 1, 1000); \& glTranslatef(0, 0, \-20); .Ve .PP Above we enable GL and set the correct perspective .PP .Vb 7 \& while (1) { \& &handlepolls; \& glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); \& glRotatef(.1, 1, 1, 1); \& &drawscene; \& $SDLAPP\->sync; \& } .Ve .PP For SDLx::App sync handles the GL buffer clean. .PP .Vb 2 \& 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 ""; \& } .Ve .PP Below we can use SDL::Events as normal: .PP .Vb 2 \& 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\en", $SDLEVENT\->motion_x, $SDLEVENT\->motion_y, $SDLEVENT\->motion_xrel, $SDLEVENT\->motion_yrel) } \& elsif ($type == 2) { print "You are pressing $key\en" } \& elsif ($type == 3) { print "You released $key\en" } \& elsif ($type == 12) { exit } \& else { print "TYPE $type UNKNOWN!\en" } \& \& if ($type == 2) { \& if ($key eq "q" or $key eq "escape") { exit } \& } \& } \& \& return ""; \& } .Ve .SH "SEE ALSO" .IX Header "SEE ALSO" perl SDLx::App OpenGL .SH AUTHORS .IX Header "AUTHORS" See "AUTHORS" in SDL.