Skip to main content
gamedev.net
🔒 Locked

problem with seeing a texture

Started by mc30900 5 replies 1.3k views
Original Post
mc30900
mc30900
hello all. i took the code from lesson 6 with the sdl convertion. for some reason i cant see the texture. here is the code:


//

#pragma comment( lib, "SDL.lib" )
#pragma comment( lib, "SDLmain.lib" )
#include <windows.h>
#include <gl\gl.h> // Header File For The OpenGL32 Library
#include <gl\glu.h> // Header File For The GLu32 Library
#include <gl\glaux.h> // Header File For The Glaux Library
#include <stdio.h>
#include <stdlib.h>

#include "SDL.h"


GLuint texture[1]; /* Storage For One Texture */

GLuint	loop;		


/* screen width, height, and bit depth */
#define SCREEN_WIDTH  640
#define SCREEN_HEIGHT 480
#define SCREEN_BPP     16

/* Define our booleans */
#define TRUE  1
#define FALSE 0

/* This is our SDL surface */
SDL_Surface *surface;

int LoadGLTextures( )
{
    /* Status indicator */
    int Status = FALSE;

    /* Create storage space for the texture */
    SDL_Surface *TextureImage[1]; 

    /* Load The Bitmap, Check For Errors, If Bitmap's Not Found Quit */
    if ( ( TextureImage[0] = SDL_LoadBMP( "data/a.bmp" ) ) )
        {

	    /* Set the status to true */
	    Status = TRUE;

	    /* Create The Texture */
	    glGenTextures( 1, &texture[0] );

	    /* Typical Texture Generation Using Data From The Bitmap */
	    glBindTexture( GL_TEXTURE_2D, texture[0] );

		
	    /* Linear Filtering */
	    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
			     GL_LINEAR_MIPMAP_NEAREST );
	    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,
			     GL_LINEAR );
	    /* Generate The Texture */
	    gluBuild2DMipmaps( GL_TEXTURE_2D, 3, TextureImage[0]->w,
			       TextureImage[0]->h, GL_RGBA,
			       GL_UNSIGNED_BYTE, TextureImage[0]->pixels );


        }

    /* Free up any memory we may have used */
    if ( TextureImage[0] )
	    SDL_FreeSurface( TextureImage[0] );

    return Status;
}

/* function to release/destroy our resources and restoring the old desktop */
void Quit( int returnCode )
{
    /* clean up the window */
    SDL_Quit( );

    /* and exit appropriately */
    exit( returnCode );
}

/* function to reset our viewport after a window resize */
int resizeWindow( int width, int height )
{
    /* Height / width ration */
    GLfloat ratio;
 
    /* Protect against a divide by zero */
   if ( height == 0 )
	height = 1;

    ratio = ( GLfloat )width / ( GLfloat )height;

    /* Setup our viewport. */
    glViewport( 0, 0, ( GLsizei )width, ( GLsizei )height );

    /* change to the projection matrix and set our viewing volume. */
    glMatrixMode( GL_PROJECTION );
    glLoadIdentity( );

    /* Set our perspective */
    gluPerspective( 45.0f, ratio, 0.1f, 100.0f );

    /* Make sure we're chaning the model view and not the projection */
    glMatrixMode( GL_MODELVIEW );

    /* Reset The View */
    glLoadIdentity( );

    return( TRUE );
}

/* function to handle key press events */
void handleKeyPress( SDL_keysym *keysym )
{
    switch ( keysym->sym )
	{
	case SDLK_ESCAPE:
	    /* ESC key was pressed */
	    Quit( 0 );
	    break;
	case SDLK_F1:
	    /* F1 key was pressed
	     * this toggles fullscreen mode
	     */
	    SDL_WM_ToggleFullScreen( surface );
	    break;
	default:
	    break;
	}

    return;
}

/* general OpenGL initialization function */

int initGL( GLvoid )
{

	 /* Load in the texture */
   if ( !LoadGLTextures( ) )
	return FALSE;

    /* Set the background black */
    glClearColor( 0.0f, 0.0f, 0.0f, 0.5f );

    /* Depth buffer setup */
    glClearDepth( 1.0f );

    /* Enables Depth Testing */
    glEnable( GL_DEPTH_TEST );

    /* Enables Smooth Color Shading */
    glShadeModel( GL_SMOOTH );

    /* Enable 2D Texture Mapping */
    glEnable( GL_TEXTURE_2D );

    
    return( TRUE );
}

/* Here goes our drawing code */
int drawGLScene( GLvoid )
{
 
    /* These are to calculate our fps */
    static GLint T0     = 0;
    static GLint Frames = 0;


    /* Clear The Screen And The Depth Buffer */
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

    /* Move Left 1.5 Units And Into The Screen 6.0 */
    glLoadIdentity();



glTranslatef(0,0,-6);

	/*
	glBegin(GL_QUADS);							
		glTexCoord2f(0,0); glVertex2f(-1,0);
		glTexCoord2f(0,1); glVertex2f(-1,1);	
		glTexCoord2f(1,1); glVertex2f(1,1);
		glTexCoord2f(1,0); glVertex2f(1,0);	
		glEnd();
		*/
	glColor4f(1,1,1,0.5f);
	 glEnable(GL_TEXTURE_2D);
		glBindTexture(GL_TEXTURE_2D, texture[0]);			
	glBegin(GL_QUADS);
		glTexCoord2f( 1.0f, 0.0f ); glVertex2f( -1.0f, -1.0f);
	glTexCoord2f( 0.0f, 0.0f ); glVertex2f(  1.0f, -1.0f);
	glTexCoord2f( 0.0f, 1.0f ); glVertex2f(  1.0f,  1.0f);
	glTexCoord2f( 1.0f, 1.0f ); glVertex2f( -1.0f,  1.0f );
glEnd();
   glDisable(GL_TEXTURE_2D);
    /* Draw it to the screen */
    SDL_GL_SwapBuffers( );

    /* Gather our frames per second */
    Frames++;
    {
	GLint t = SDL_GetTicks();
	if (t - T0 >= 5000) {
	    GLfloat seconds = (t - T0) / 1000.0;
	    GLfloat fps = Frames / seconds;
	    printf("%d frames in %g seconds = %g FPS\n", Frames, seconds, fps);
	    T0 = t;
	    Frames = 0;
	}
    }


    return( TRUE );
}

int main( int argc, char **argv )
{
    /* Flags to pass to SDL_SetVideoMode */
    int videoFlags;
    /* main loop variable */
    int done = FALSE;
    /* used to collect events */
    SDL_Event event;
    /* this holds some info about our display */
    const SDL_VideoInfo *videoInfo;
    /* whether or not the window is active */
    int isActive = TRUE;

    /* initialize SDL */
    if ( SDL_Init( SDL_INIT_VIDEO ) < 0 )
	{
	    fprintf( stderr, "Video initialization failed: %s\n",
		     SDL_GetError( ) );
	    Quit( 1 );
	}

    /* Fetch the video info */
    videoInfo = SDL_GetVideoInfo( );

    if ( !videoInfo )
	{
	    fprintf( stderr, "Video query failed: %s\n",
		     SDL_GetError( ) );
	    Quit( 1 );
	}

    /* the flags to pass to SDL_SetVideoMode */
    videoFlags  = SDL_OPENGL;          /* Enable OpenGL in SDL */
    videoFlags |= SDL_GL_DOUBLEBUFFER; /* Enable double buffering */
    videoFlags |= SDL_HWPALETTE;       /* Store the palette in hardware */
    videoFlags |= SDL_RESIZABLE;       /* Enable window resizing */

    /* This checks to see if surfaces can be stored in memory */
    if ( videoInfo->hw_available )
	videoFlags |= SDL_HWSURFACE;
    else
	videoFlags |= SDL_SWSURFACE;

    /* This checks if hardware blits can be done */
    if ( videoInfo->blit_hw )
	videoFlags |= SDL_HWACCEL;

    /* Sets up OpenGL double buffering */
    SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 );

    /* get a SDL surface */
    surface = SDL_SetVideoMode( SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP,
				videoFlags );

    /* Verify there is a surface */
    if ( !surface )
	{
	    fprintf( stderr,  "Video mode set failed: %s\n", SDL_GetError( ) );
	    Quit( 1 );
	}

    /* initialize OpenGL */
    initGL( );

    /* resize the initial window */
    resizeWindow( SCREEN_WIDTH, SCREEN_HEIGHT );

    /* wait for events */ 
    while ( !done )
	{
	    /* handle the events in the queue */

	    while ( SDL_PollEvent( &event ) )
		{
		    switch( event.type )
			{
			case SDL_ACTIVEEVENT:
			    /* Something's happend with our focus
			     * If we lost focus or we are iconified, we
			     * shouldn't draw the screen
			     */
			    if ( event.active.gain == 0 )
				isActive = FALSE;
			    else
				isActive = TRUE;
			    break;			    
			case SDL_VIDEORESIZE:
			    /* handle resize event */
			    surface = SDL_SetVideoMode( event.resize.w,
							event.resize.h,
							16, videoFlags );
			    if ( !surface )
				{
				    fprintf( stderr, "Could not get a surface after resize: %s\n", SDL_GetError( ) );
				    Quit( 1 );
				}
			    resizeWindow( event.resize.w, event.resize.h );
			    break;
			case SDL_KEYDOWN:
			    /* handle key presses */
			    handleKeyPress( &event.key.keysym );
			    break;
			case SDL_QUIT:
			    /* handle quit requests */
			    done = TRUE;
			    break;
			default:
			    break;
			}
		}

	    /* draw the scene */
	    if ( isActive )
		drawGLScene();
	}

    /* clean ourselves up and exit */
    Quit (0);

    /* Should never get here */
    return 0;
}



any idea whats wrong here? thanks in advance
deathkrush
deathkrush
It works on my computer when I change GL_RGBA to GL_RGB, the colors are kind of wrong, but I can see the texture. My BMP files don't have an alpha channel.
deathkrushPS3/Xbox360 Graphics Programmer, Mass Media.Completed Projects: Stuntman Ignition (PS3), Saints Row 2 (PS3), Darksiders(PS3, 360)
sirGustav
sirGustav
Since that code isn't checking the return-value of initGL() my best guess is that you are missing "data/a.bmp".
mc30900
mc30900
yeah that was the problem but now i have another problem:
the texture is orange.
i dont think its the alpha channel because i made
glColor4f(1,1,1,0.5f);
so i have no idea what is it.
anyone has any idea?
thanks in advance
deathkrush
deathkrush
Well, if your BMP texture is 24-bit (without alpha channel), use GL_BGR_EXT format as the argument for gluBuild2DMipmaps. For 32-bit textures you will have to do byte-swapping because there is no GL_ABGR_EXT format in OpenGL as far as I know.
deathkrushPS3/Xbox360 Graphics Programmer, Mass Media.Completed Projects: Stuntman Ignition (PS3), Saints Row 2 (PS3), Darksiders(PS3, 360)
mc30900
mc30900
now i have a problem.
i'm trying to load a JPG texture with the libary of SDL.
but the quad is white and i have no idea why.
here is the code which is loading the texture:
int LoadGLTextures( ){    /* Status indicator */    int Status = FALSE;    /* Create storage space for the texture */    SDL_Surface *TextureImage[2];     /* Load The Bitmap, Check For Errors, If Bitmap's Not Found Quit */    if ( ( TextureImage[0] = IMG_Load( "data/a.bmp" ) ) && ( TextureImage[1] = IMG_Load( "data/b.jpg" ) ) )        {	  	    Status = TRUE;	   	    glGenTextures( 2, &texture[0] );for (int i=0;i<2;i++){	   	    glBindTexture( GL_TEXTURE_2D, texture );			    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,			     GL_LINEAR_MIPMAP_NEAREST );	    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,			     GL_LINEAR );		glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);gluBuild2DMipmaps( GL_TEXTURE_2D, 3, TextureImage->w,			       TextureImage->h, GL_RGB,			       GL_UNSIGNED_BYTE, TextureImage->pixels );		}        }    /* Free up any memory we may have used */	for (int z=0;z<2;z++)	{    if ( TextureImage[z] )	    SDL_FreeSurface( TextureImage[z] );	}    return Status;}


i'm trying to see the texture 1 which is the jpg and i see white.
anyone has any idea why this is happening and how i can fix it?
thanks in advance.
mc30900
mc30900
nvm i forgot to include jpeg.dll :P

Topic Locked

This topic has been locked by a moderator. New replies are not allowed.

Sign in to reply to this topic.