Jump to content
  • Advertisement
Sign in to follow this  
BigJim

Upgrading from SDL 1.2 to 1.3

This topic is 3225 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

Hi, I've upgraded the version of SDL I'm been using for my project from 1.2 to 1.3(built from SVN head) and I've been having very strange problems with OpenGL textures: I'm using SDL_Image(also built from head) to load my textures itno SDL_surfaces and am then uploading them manually, but whatever I do they just appear white. I've been using gDEbugger to investigate this problem and it's showing that the textures are uploaded correctly and the opengl state is more or less identical to that of the previous working SDL 1.2 version. Has anyone else experienced anything similar with SDL 1.3? Cheers Jamie

Share this post


Link to post
Share on other sites
Advertisement
I have messed around with SDL 1.3, but I haven't started using it seriously. If you want you could post a small example demonstrating this behaviour I could see if I can reproduce it on my machine.

Share this post


Link to post
Share on other sites
Good idea! The following very rapid hack of my game's main.cpp does the same - gDEbugger shows the image fine, but the quad is entirely white:


// System includes
#include <SDL.h>
#include <SDL_opengl.h>
#include <SDL_video.h>

void CalculateOrthoMatrix()
{
// Set up orthographic 2D matrices
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(
0.0f,
480,
320,
0.0f,
-1.0f,
1.0f);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}


void InitSDL()
{
// Initialise SDL
SDL_Init(SDL_INIT_EVERYTHING);

// Enable key repeats
SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);

// Set opengl parameters - double buffered 32 bit colour
SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 8);

SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 0);
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);

SDL_GL_SetAttribute(SDL_GL_RETAINED_BACKING, 0);
SDL_GL_SetAttribute(SDL_GL_ACCELERATED_VISUAL, 1);

// Create window
SDL_WindowID windowID = SDL_CreateWindow(NULL,
SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
480,
320,
SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN);

// Loop through all renderers found
int rendererIndex = 0;
int numRenderers = SDL_GetNumRenderDrivers();
for(int r = 0; r < numRenderers; r++)
{
// Get driver info
SDL_RendererInfo rendererInfo;
SDL_GetRenderDriverInfo(r, &rendererInfo);

// If this is the opengl driver use this
if(strcmp(rendererInfo.name, "opengl") == 0)
{
rendererIndex = r;
}
}

// Create renderer
SDL_CreateRenderer(windowID, rendererIndex, 0);

// Immediately pump events(this seems to be
// Required for messageboxes to ever work
SDL_PumpEvents();

glClearColor(0.0, 0.0, 0.0, 0.0);

// Enable normal alpha blending
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glShadeModel(GL_FLAT);

glHint(GL_LINE_SMOOTH_HINT, GL_DONT_CARE);

// Get initial viewing matrices
CalculateOrthoMatrix();
}

int main(int argc, char* argv[])
{

// Initialise SDL
InitSDL();

SDL_Surface *pImageFormatSurface = SDL_LoadBMP("test.bmp");

GLuint textureHandle;
glEnable(GL_TEXTURE_2D);
glGenTextures(1, &textureHandle);
glBindTexture(GL_TEXTURE_2D, textureHandle);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, pImageFormatSurface->w, pImageFormatSurface->h, 0, GL_RGB, GL_UNSIGNED_BYTE, pImageFormatSurface->pixels);

SDL_FreeSurface(pImageFormatSurface);

// Main SDL event loop
bool shouldQuit = false;
while(!shouldQuit)
{
SDL_Event sdlEvent;
while(SDL_PollEvent(&sdlEvent) && !shouldQuit)
{
// Select what type of event's occured
switch(sdlEvent.type)
{
// Quit event
case SDL_QUIT:
{
shouldQuit = true; // Sets quitting flag
}break;
}
}

// Clear depth and colour buffers
glClear(GL_COLOR_BUFFER_BIT);

glBegin(GL_QUADS);

glTexCoord2f(0.0f, 0.0f);
glVertex2f(0.0f, 0.0f);

glTexCoord2f(1.0f, 0.0f);
glVertex2f(480.0f, 0.0f);

glTexCoord2f(1.0f, 1.0f);
glVertex2f(480.0f, 320.0f);

glTexCoord2f(0.0f, 1.0f);
glVertex2f(0.0f, 320.0f);

glEnd();
SDL_RenderPresent();
}

// Quit SDL
SDL_Quit();

return 0;
}


Share this post


Link to post
Share on other sites
I don't have much time, but I can give you some hints.

Firstly, you are mixing SDL's new *Render* functions with raw OpenGL. I don't think this is really supported, I think if you want to use raw OpenGL you should use the SDL_GL_*() functions.

Take a look at the SDL test files for inspiration though, testgl2.c is particularly applicable I think. You can cut down that to the minimal code required to create and run an OpenGL program with the new API.

Share this post


Link to post
Share on other sites
Hmm, that does make sense as the only thing that I can see which would explain the problem is that SDL's messing with the OpenGL state....I'll try switching to those functions and see what happens. Will they also work with OpenGL ES? I'm also targetting the iphone and that code basically came from the fireworks sample.

Share this post


Link to post
Share on other sites
Quote:
Original post by BigJim
Hmm, that does make sense as the only thing that I can see which would explain the problem is that SDL's messing with the OpenGL state....I'll try switching to those functions and see what happens. Will they also work with OpenGL ES? I'm also targetting the iphone and that code basically came from the fireworks sample.


I'm using SDL 1.3 on the iPhone and Windows without problems, instead of using glBegin/glEnd you can use VB= for instance. Basically is the same.

One question: Can SDL_Window window_id variable be local instead of class variable or global?

Thanks.

Share this post


Link to post
Share on other sites
Well, as SDL's written in C, SDL_Window won't have a destructor or anything so presumably you can do what you like with it :) How are you setting up your window/opengl context ricardo?

Share this post


Link to post
Share on other sites
Hi,

I've taken test2.c and added texture loading to it and exactly the same thing seems to be happening...Did anyone try compiling my demo program?

Cheers

Jamie

Share this post


Link to post
Share on other sites
Hi,

I've taken test2.c and added texture loading to it and exactly the same thing seems to be happening...Did anyone try compiling my demo program?

Cheers

Jamie

Share this post


Link to post
Share on other sites
Hi,

I've taken test2.c and added texture loading to it and exactly the same thing seems to be happening...Did anyone try compiling my demo program?

Cheers

Jamie

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!