Hello all,
I have a question about an issue I’m having with an SDL/OpenGL application I’m developing. In short, switching from windowed mode to fullscreen mode (using largely the same code) appears to cause a color depth reduction, so if I render a gradient color range, I get blocky separations rather than a smooth gradient. This is best illustrated by the following two screenshots:
Proper gradient
[Image: http://melinda.fairserve.net/~josh/depthchange/fulldepth.png ]
Blocky separations
[Image: http://melinda.fairserve.net/~josh/depthchange/lowdepth.png ]
You can see that the color changes are not smooth in the second image as they are in the first. The only change I make as far as the SDL code between the two is to specify that the window should be fullscreen when I call SDL_SetVideoMode(). It should be noted that the rendering is consistent no matter how many times I switch between fullscreen and windowed mode (using a hotkey in my program).
I am trying to determine whether this is an issue on the OpenGL side (with my shaders, perhaps), or some other issue. I am rather new to SDL so I was wondering if I missed something when initializing the window. The relevant code is as follows:
Code:
/*
- Screen.cpp
- dominicus
*/
#include “Screen.h”
Screen::Screen(bool fullScreen) : fullScreen(fullScreen) {
// initialize our viewing screen
width = (fullScreen ? systemInfo.screenWidth : gamePrefs.getInt(“windowWidth”));
height = (fullScreen ? systemInfo.screenHeight : gamePrefs.getInt(“windowHeight”));
aspectRatio = (float) width / (float) height;
uint32_t flags = SDL_OPENGL | SDL_DOUBLEBUF | SDL_HWSURFACE | (fullScreen ? SDL_FULLSCREEN : 0);
if(! SDL_VideoModeOK(
width,
height,
gamePrefs.getInt("windowColorDepth"),
flags
))
ProgramLog::report(LOG_FATAL, "SDL cannot initialize a window with the specified settings.");
SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 5);
SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 5);
SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 5);
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, gamePrefs.getInt("windowColorDepth"));
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
SDL_Surface* surface = SDL_SetVideoMode(
width,
height,
gamePrefs.getInt("windowColorDepth"),
flags
);
if(surface == NULL)
ProgramLog::report(LOG_FATAL, "SDL could not initialize an OpenGL-ready window.");
if(! fullScreen)
SDL_WM_SetCaption("dominicus", NULL);
}
Any help or pointers would be appreciated. I develop on Mac OS X 10.6.4 (Snow Leopard) using Xcode 3.2.2, and I use the SDL 1.2.14 framework. I have an Nvidia 9400M which supports OpenGL 2.1 on my system.
Thanks.