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