HI Daniel,

I have fixed the issue with the get_pixels_ptr() function. This fix will
appear in SDL 2.5. Moreover in SDL 2.5 I have removed SDL::OpenGL, instead
you can use POGL (cpan OpenGL). It is more complete and works with SDLx::App
(renamed SDL::App) seamlessly. You can get the new SDL for now from
http://github.com/kthakore/SDL_perl . Here is the example script that use
SDLx::App, OpenGL, and the new $surface->get_pixels_ptr();

http://github.com/kthakore/SDL_perl/blob/master/examples/cookbook/pogl_sdl_texture.pl

run it like so

pogl_sdl_texture.pl someimage.[png][bmp] ...

Regards,
Kartik Thakore


2010/6/6 Daniel Turczański <turczan...@gmail.com>

> Hi,
> I tried to load BMP file from disk and display a quad textured with it.
> Here's the full script: http://paste-it.net/public/nc1f11b/
>
> All I get is quad with weird colors:
> http://img192.imageshack.us/img192/9177/sdlopengl.png
>
> Any ideas?
>
> Regards,
> Daniel
>
>
>
>
> #!/usr/bin/perl
> use warnings;
> use strict;
>
> use SDL;
> use SDL::App;
> use SDL::Surface;
> use SDL::Event;
> use SDL::OpenGL;
> use SDL::Image;
> use SDL::Color;
>
> my $app;  #sdl window
> my $sdl_timer;
> my $event;
>
> package main;
> init_SDL();
>
> while(1) {
>        pump_sdl();
> }
>
>
>
> ###################################################
>
> sub init_SDL{
> $app = new SDL::App -w => 1024, -h => 768, -d => 16, -gl =>1;
>
> print "Initializing OpenGL settings\n";
> printf "%-24s%s\n", "GL_RED_SIZE ", $app->attribute( SDL_GL_RED_SIZE());
> printf "%-24s%s\n", "GL_GREEN_SIZE ", $app->attribute(
> SDL_GL_GREEN_SIZE());
> printf "%-24s%s\n", "GL_BLUE_SIZE ", $app->attribute( SDL_GL_BLUE_SIZE() );
> printf "%-24s%s\n", "GL_DEPTH_SIZE ", $app->attribute( SDL_GL_DEPTH_SIZE()
> );
> printf "%-24s%s\n", "GL_DOUBLEBUFFER ", $app->attribute(
> SDL_GL_DOUBLEBUFFER() );
>
>
> #glEnable(GL_CULL_FACE);
> #glFrontFace(GL_CCW);
> #glCullFace(GL_BACK);
>
> InitView();
> DrawScene();
> $app->sync();
>
> $event = new SDL::Event;
>
> #$sdl_timer = Glib::Timeout->add (100,\&pump_sdl);
>
> }
> #######################################################
> sub pump_sdl{
> #for (0 .. 5) {
>                        my $sdl_event = SDL::Event->new();
>                        SDL::Events::pump_events();    #get events from SDL
> queue
>                        my $poll = SDL::Events::poll_event($event);    #get
> the first one
>                        DrawScene();
>  #    }
>
> return 1;
> }
> #######################################################
> sub DrawScene {
>
>    glClear( GL_DEPTH_BUFFER_BIT()
>        | GL_COLOR_BUFFER_BIT());
>
>    glLoadIdentity();
>
>    glTranslate(0,0,-6.0);
>    glColor(1,1,1);
>
>        glBegin(GL_QUADS);
>                glTexCoord(0.0, 0.0); glVertex(-1.0, -1.0, 0);
>                glTexCoord(1.0, 0.0); glVertex(1.0, -1.0, 0);
>                glTexCoord(1.0, 1.0); glVertex(1.0, 1.0, 0);
>                glTexCoord(0.0, 1.0); glVertex(-1.0, 1.0, 0);
>        glEnd();
>
>    $app->sync();
> }
>
> sub InitView {
>        my $width = 1024;
>        my $height = 800;
>
>        glClearColor(0.0, 0.0, 0.0, 0.0);
>        glShadeModel(GL_SMOOTH);
>        glClearDepth(1.0);
>        glDisable(GL_DEPTH_TEST);
>        glBlendFunc(GL_SRC_ALPHA, GL_ONE);
>        glEnable(GL_BLEND);
>
>        glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
>
>        glEnable(GL_TEXTURE_2D);
>        LoadTexture();
>
>        glViewport(0,0,1024,768);
>        glMatrixMode(GL_PROJECTION);
>        glLoadIdentity();
>        gluPerspective(45.0, $width/$height, 1.0, 100.0);
>
>        glMatrixMode(GL_MODELVIEW);
>        glLoadIdentity();
> }
>
>
> sub LoadTexture {
>  my $surface;
>  my $nOfColors;
>  my $texture_format;
>  my $texture = 0;
>
>
> if ( ($surface = SDL::Image::load("spark.bmp"))){
>        # Check that the image's width is a power of 2
>        if ( ($surface->w & ($surface->w - 1)) != 0 ) {
>                print "warning: image.bmp's width is not a power of 2\n";
>        }
>
>        # Also check if the height is a power of 2
>        if ( ($surface->h & ($surface->h - 1)) != 0 ) {
>                print "warning: image.bmp's height is not a power of 2\n";
>        }
>
>        #get the number of channels in the SDL surface
>        $nOfColors = $surface->format->BytesPerPixel;
>        if ($nOfColors == 4)     # contains an alpha channel
>        {
>                if ($surface->format->Rmask == 0x000000ff){
>                        $texture_format = GL_RGBA;}
>                else{
>                        $texture_format = GL_BGRA;}
>        } elsif ($nOfColors == 3)     # no alpha channel
>        {
>                if ($surface->format->Rmask == 0x000000ff){
>                        $texture_format = GL_RGB;}
>                else{
>                        $texture_format = GL_BGR;}
>        } else {
>                print "warning: the image is not truecolor..  this will
> probably break\n";
>                #this error should not go unhandled
>        }
>
>        # Have OpenGL generate a texture object handle for us
>        glGenTextures(1);
>
>        # Bind the texture object
>        glBindTexture( GL_TEXTURE_2D, 1);
>
>        #Set the texture's stretching properties
>        glTexParameter( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
>        glTexParameter( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
>
>        # Edit the texture object's image data using the information
> SDL_Surface gives us
>        glTexImage2D( GL_TEXTURE_2D, 0, $nOfColors,
>                                        $surface->w, $surface->h,
>                                        0, $texture_format,
> GL_UNSIGNED_BYTE, $surface->get_pixels_ptr() );
>
> #       glTexImage2D(GL_TEXTURE_2D, 0, 3, $surface->w, $surface->h,  0,
> $texture_format, GL_UNSIGNED_BYTE, $surface->get_pixels_ptr());
> }
> else {
>        print("SDL could not load image.bmp: %s\n".SDL_GetError());
>        SDL::Quit();
>        return 1;
> }
>
> # Free the SDL_Surface only if it was successfully created
> if ( $surface ) {
>        #SDL::FreeSurface( $surface );
> }
>
> }
>
>
>

Reply via email to