Jump to content
  • Advertisement
Sign in to follow this  
Jao Assy

OpenGL Texture fail OPENGL/SDL

This topic is 2362 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

I don´t know why the texture is not appearing at the screen, i ve tryid with GLUT and it works verywell, but i switch to SDL because i think it is a best event handler.

i can load the texture because i am using the same method that i used before with glut.




Here is my code:
#include "stdafx.h"
using namespace std;
//Screen attributes
const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;
const int SCREEN_BPP = 32;
//The frame rate
const int FRAMES_PER_SECOND = 60;
//The attributes of the square
const int SQUARE_WIDTH = 20;
const int SQUARE_HEIGHT = 20;
//pos
double left_pos = 0.0;
double up_pos = 0.0;
//mov
double movimento = 1.0;
//Event handler
SDL_Event event;
unsigned int tex[100];
unsigned int loadTexture(const char* filename,int x,int y)
{
SDL_Surface* img = SDL_LoadBMP(filename);
unsigned int id;
glGenTextures(2,&id);
glBindTexture(GL_TEXTURE_2D,id);
glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,x,y,0,GL_BGR_EXT,GL_UNSIGNED_BYTE,img->pixels);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
SDL_FreeSurface(img);
return id;
}
bool init_GL()
{
//Set clear color
glClearColor( 0, 0, 0, 0 );
//Set projection
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
glOrtho( 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, -1, 1 );
//Initialize modelview matrix
glMatrixMode( GL_PROJECTION);
glLoadIdentity();
glEnable(GL_TEXTURE_2D);

//If there was any errors
if( glGetError() != GL_NO_ERROR )
{
return false;
}

//If everything initialized
return true;
}
bool Init()
{
//Initialize SDL
if( SDL_Init( SDL_INIT_EVERYTHING ) < 0 )
{
return false;
}

//Create Window
if( SDL_SetVideoMode( SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, SDL_SWSURFACE | SDL_OPENGL ) == NULL )
{
return false;
}

//Initialize OpenGL
if( init_GL() == false )
{
return false;
}

//Set caption
SDL_WM_SetCaption( "OpenGL Test", NULL );
SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 );
return true;
}
void clean_up()
{
//Quit SDL
SDL_Quit();
}


void squareShow()
{

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D,tex[0]);
glBegin(GL_QUADS);
glTexCoord2f(0.0,1.0);
glVertex2f(100+left_pos,200+up_pos);glTexCoord2f(1.0,1.0);
glVertex2f(200+left_pos,200+up_pos);glTexCoord2f(1.0,0.0);
glVertex2f(200+left_pos,100+up_pos);glTexCoord2f(0.0,0.0);
glVertex2f(100+left_pos,100+up_pos);

glEnd();
}
int main( int argc, char* args[] )
{
tex[0] = loadTexture("minecraft_s1.bmp",256,256);

//initialize SDL
SDL_Init(SDL_INIT_EVERYTHING);

bool quit = false;

if( Init() == false )
{
return 1;
}

bool left = false;
bool right = false;
bool up = false;
bool down = false;



while( quit == false )
{


if(up == true || down == true || left == true || right == true)
{

cout <<"X: "<<left_pos<<" Y: "<<up_pos<<endl;
}

//EVENTS
while ( SDL_PollEvent(&event) )
{

if ( event.type == SDL_KEYDOWN && event.key.keysym.sym == SDLK_ESCAPE)
{
quit = true;
}
// left right move
if ( event.type == SDL_KEYDOWN && event.key.keysym.sym == SDLK_d )
{
right = true;
}
if ( event.type == SDL_KEYUP && event.key.keysym.sym == SDLK_d )
{
right = false;
}
if ( event.type == SDL_KEYDOWN && event.key.keysym.sym == SDLK_a )
{
left = true;
}
if ( event.type == SDL_KEYUP && event.key.keysym.sym == SDLK_a )
{
left = false;
}
// up down move
if ( event.type == SDL_KEYDOWN && event.key.keysym.sym == SDLK_w )
{
up = true;
}
if ( event.type == SDL_KEYUP && event.key.keysym.sym == SDLK_w )
{
up = false;
}
if ( event.type == SDL_KEYDOWN && event.key.keysym.sym == SDLK_s )
{
down = true;
}
if ( event.type == SDL_KEYUP && event.key.keysym.sym == SDLK_s )
{
down = false;
}
if ( event.type == SDL_KEYUP && event.key.keysym.sym == SDLK_r )
{
glClearColor(1,0,0,1);
}

}

if(right == true)
{
left_pos = left_pos + movimento;
}
if(left == true)
{
left_pos = left_pos - movimento;
}
if(up == true)
{
up_pos = up_pos - movimento;
}
if(down == true)
{
up_pos = up_pos + movimento;
}
if( event.type == SDL_QUIT )
{
quit = true;
}


//Clear the screen
glClear( GL_COLOR_BUFFER_BIT );

squareShow();



glFlush();
//Update screen
SDL_GL_SwapBuffers();

}



clean_up();

return 0;
}

Share this post


Link to post
Share on other sites
Advertisement
Posted · Hidden
Hidden
I don´t know why the texture is not appearing at the screen, i ve tried with GLUT and it works verywell, but i switch to SDL because i think it is a best event handler.

i can load the texture because i am using the same method that i used before with glut.




Here is my code:
#include "stdafx.h"
using namespace std;
//Screen attributes
const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;
const int SCREEN_BPP = 32;
//The frame rate
const int FRAMES_PER_SECOND = 60;
//The attributes of the square
const int SQUARE_WIDTH = 20;
const int SQUARE_HEIGHT = 20;
//pos
double left_pos = 0.0;
double up_pos = 0.0;
//mov
double movimento = 1.0;
//Event handler
SDL_Event event;
unsigned int tex[100];
unsigned int loadTexture(const char* filename,int x,int y)
{
SDL_Surface* img = SDL_LoadBMP(filename);
unsigned int id;
glGenTextures(2,&id);
glBindTexture(GL_TEXTURE_2D,id);
glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,x,y,0,GL_BGR_EXT,GL_UNSIGNED_BYTE,img->pixels);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
SDL_FreeSurface(img);
return id;
}
bool init_GL()
{
//Set clear color
glClearColor( 0, 0, 0, 0 );
//Set projection
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
glOrtho( 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, -1, 1 );
//Initialize modelview matrix
glMatrixMode( GL_PROJECTION);
glLoadIdentity();
glEnable(GL_TEXTURE_2D);

//If there was any errors
if( glGetError() != GL_NO_ERROR )
{
return false;
}

//If everything initialized
return true;
}
bool Init()
{
//Initialize SDL
if( SDL_Init( SDL_INIT_EVERYTHING ) < 0 )
{
return false;
}

//Create Window
if( SDL_SetVideoMode( SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, SDL_SWSURFACE | SDL_OPENGL ) == NULL )
{
return false;
}

//Initialize OpenGL
if( init_GL() == false )
{
return false;
}

//Set caption
SDL_WM_SetCaption( "OpenGL Test", NULL );
SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 );
return true;
}
void clean_up()
{
//Quit SDL
SDL_Quit();
}


void squareShow()
{

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D,tex[0]);
glBegin(GL_QUADS);
glTexCoord2f(0.0,1.0);
glVertex2f(100+left_pos,200+up_pos);glTexCoord2f(1.0,1.0);
glVertex2f(200+left_pos,200+up_pos);glTexCoord2f(1.0,0.0);
glVertex2f(200+left_pos,100+up_pos);glTexCoord2f(0.0,0.0);
glVertex2f(100+left_pos,100+up_pos);

glEnd();
}
int main( int argc, char* args[] )
{
tex[0] = loadTexture("minecraft_s1.bmp",256,256);

//initialize SDL
SDL_Init(SDL_INIT_EVERYTHING);

bool quit = false;

if( Init() == false )
{
return 1;
}

bool left = false;
bool right = false;
bool up = false;
bool down = false;



while( quit == false )
{


if(up == true || down == true || left == true || right == true)
{

cout <<"X: "<<left_pos<<" Y: "<<up_pos<<endl;
}

//EVENTS
while ( SDL_PollEvent(&event) )
{

if ( event.type == SDL_KEYDOWN && event.key.keysym.sym == SDLK_ESCAPE)
{
quit = true;
}
// left right move
if ( event.type == SDL_KEYDOWN && event.key.keysym.sym == SDLK_d )
{
right = true;
}
if ( event.type == SDL_KEYUP && event.key.keysym.sym == SDLK_d )
{
right = false;
}
if ( event.type == SDL_KEYDOWN && event.key.keysym.sym == SDLK_a )
{
left = true;
}
if ( event.type == SDL_KEYUP && event.key.keysym.sym == SDLK_a )
{
left = false;
}
// up down move
if ( event.type == SDL_KEYDOWN && event.key.keysym.sym == SDLK_w )
{
up = true;
}
if ( event.type == SDL_KEYUP && event.key.keysym.sym == SDLK_w )
{
up = false;
}
if ( event.type == SDL_KEYDOWN && event.key.keysym.sym == SDLK_s )
{
down = true;
}
if ( event.type == SDL_KEYUP && event.key.keysym.sym == SDLK_s )
{
down = false;
}
if ( event.type == SDL_KEYUP && event.key.keysym.sym == SDLK_r )
{
glClearColor(1,0,0,1);
}

}

if(right == true)
{
left_pos = left_pos + movimento;
}
if(left == true)
{
left_pos = left_pos - movimento;
}
if(up == true)
{
up_pos = up_pos - movimento;
}
if(down == true)
{
up_pos = up_pos + movimento;
}
if( event.type == SDL_QUIT )
{
quit = true;
}


//Clear the screen
glClear( GL_COLOR_BUFFER_BIT );

squareShow();



glFlush();
//Update screen
SDL_GL_SwapBuffers();

}



clean_up();

return 0;
}

Share this post


Link to post
pretty common error. You are loading a texture without any GL context active. Try to load after SDL initialization and window creation.

A side note. Why are you using

glGenTextures(2,&id)


it should be


glGenTextures(1,&id)


since you have

uint32 id;


and not

uint32 id[2];


of course your case will work anyway but is a bit inconsistent generating 2 names and then using only 1, and even if you have

uint32 id[2];


that's wrong since you are returning just only 1 name. In a scenario where you are loading/unloading many textures there will be a resource leak (the resource in that case are the names). So after loading/unloading 2^31-1 textures you end up available names ^^ (and that is just the best thing that can happen) Edited by DemonRad

Share this post


Link to post
Share on other sites
cross posting should be avoided. Anyway I answered you in your topic in OpenGL forum.

http://www.gamedev.net/topic/624401-texture-doesn%c2%b4t-work-opengl-sdl/

Share this post


Link to post
Share on other sites
I´m sorry about the cross posting thing, but i did not know where should i post my doubt, talking about it , its working, was that DemonRad mentioned before, loading the texture after the initialization of SDL and the window, thank you for your kindness :D

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!