Skip to main content
GameDev.net gamedev.net
🔒 Locked

Texture fail OPENGL/SDL

Started by Jao Assy May 3, 2012 at 8:31 AM 5 replies 1.7k views
Original Post
Jao Assy
Jao Assy
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;
}
Dario Oliveri
Dario Oliveri
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)
Peace and love, now I understand really what it means! Guardian Angels exist! Thanks!
GameGugu Game Team
GameGugu Game Team
hi, if you gave up to use GLUT, you may ignore many little things, for example, how did you deal with your camera? have you focus the camera on the stuff you want to show?
Dario Oliveri
Dario Oliveri
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/
Peace and love, now I understand really what it means! Guardian Angels exist! Thanks!
Brother Bob
Brother Bob
Yeah, don't cross post. Merged the topics into one since there were replies in both threads already.
Jao Assy
Jao Assy
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

Topic Locked

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

Sign in to reply to this topic.