SDL/OpenGL fullscreen text rendering
So I have this blob of code here:
When I run it windowed (send false to initGL) it renders happy green text. WHen I send true, and it goes to fullscreen its just a white screen and a mouse.
I tried drawing a yellow square, works fine in both windowed and fullscreen. Have not tried loading a texture via some other method yet, have to go to work.
So, why does my renderText method fail in fullscreen mode?
Code:
#include <iostream>
#include <SDL/SDL.h>
#include <SDL/SDL_opengl.h>
#include <SDL_ttf/SDL_ttf.h>
#define wWidth 1024
#define wHeight 800
#define wDepth 32
void kill() {
SDL_Quit();
exit(0);
}
void shouldExit(SDL_Event event) {
if (event.type == SDL_QUIT) {
kill();
}
else if (event.type == SDL_KEYDOWN) {
if (event.key.keysym.sym == SDLK_ESCAPE) {
kill();
}
}
}
void renderText(TTF_Font *font, GLubyte R, GLubyte G, GLubyte B, double X,
double Y, double Z, std::string text) {
SDL_Color color = {R, G, B};
SDL_Surface *message = TTF_RenderText_Blended(font, text.c_str(), color);
unsigned Texture = 0;
glGenTextures(1, &Texture);
glBindTexture(GL_TEXTURE_2D, Texture);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, message->w, message->h, 0, GL_BGRA, GL_UNSIGNED_BYTE, message->pixels);
glBegin(GL_QUADS);
glTexCoord2d(0, 0); glVertex3d(X, Y, Z);
glTexCoord2d(1, 0); glVertex3d(X+message->w, Y, Z);
glTexCoord2d(1, 1); glVertex3d(X+message->w, Y+message->h, Z);
glTexCoord2d(0, 1); glVertex3d(X, Y+message->h, Z);
glEnd();
glDeleteTextures(1, &Texture);
SDL_FreeSurface(message);
SDL_GL_SwapBuffers();
}
int initGL(int width, int height, int depth, bool fullscreen) {
if ( SDL_Init(SDL_INIT_VIDEO) != 0 ) {
printf("Unable to initialize SDL: %s\n", SDL_GetError());
return 1;
}
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
int flags;
if (fullscreen) {
flags = SDL_OPENGL | SDL_FULLSCREEN;
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, 16);
}
else flags = SDL_OPENGL;
SDL_WM_SetCaption("Window", NULL);
SDL_Surface* screen = SDL_SetVideoMode(width, height, depth, flags);
TTF_Init();
atexit(TTF_Quit);
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glClearColor(1.0f, 1.0f, 1.0f, 0.0f);
glViewport(0, 0, width, height);
glClear(GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0f, (float)width, (float)height, 0.0f, -1.0f, 1.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
SDL_GL_SwapBuffers();
return 0;
}
int main(int argc, char* args[]) {
initGL(wWidth, wHeight, wDepth, true);
glClear(GL_COLOR_BUFFER_BIT);
TTF_Font *font = TTF_OpenFont("FreeSerifItalic.ttf", 24);
renderText(font, 0, 255, 0, 100, 100, 0, "draw a thingamabbo");
bool running = true;
SDL_Event event;
while (running) {
SDL_PollEvent(&event);
shouldExit(event);
}
return 0;
}When I run it windowed (send false to initGL) it renders happy green text. WHen I send true, and it goes to fullscreen its just a white screen and a mouse.
I tried drawing a yellow square, works fine in both windowed and fullscreen. Have not tried loading a texture via some other method yet, have to go to work.
So, why does my renderText method fail in fullscreen mode?
The machine does not run without the coin.
My first instinct is:
Try rendering your font inside your while loop, and don't forget SDL_GL_SwapBuffers(); to get your stuff on the screen.
It doesn't look like you have a legit render function set up. And the way you're handling your events is kinda... scattered. Take a look at my sample code (not that its the best way)
http://rafb.net/p/jE70Oz59.html
I know, you didn't ask for your code to be critiqued, but I took the liberty anyway
So yea, try placing your render stuff inside your loop (or better yet make a new render function that you can call) and don't forget to swap buffers. I'm guessing SDL does some fancy footwork when its setting fullscreen which ends up killing whatever you're trying to draw because you're not drawing it continuously and or swapping the buffers.
Other than that, I have no clue, and I'm not about to try to get that small piece of code to run
Good luck
edit: typo
Try rendering your font inside your while loop, and don't forget SDL_GL_SwapBuffers(); to get your stuff on the screen.
It doesn't look like you have a legit render function set up. And the way you're handling your events is kinda... scattered. Take a look at my sample code (not that its the best way)
http://rafb.net/p/jE70Oz59.html
I know, you didn't ask for your code to be critiqued, but I took the liberty anyway

So yea, try placing your render stuff inside your loop (or better yet make a new render function that you can call) and don't forget to swap buffers. I'm guessing SDL does some fancy footwork when its setting fullscreen which ends up killing whatever you're trying to draw because you're not drawing it continuously and or swapping the buffers.
Other than that, I have no clue, and I'm not about to try to get that small piece of code to run

Good luck
edit: typo
The code was a quick dumb test to see if it worked, apparently not. I'll setup a render loop and check out your code in the intro c++ class I have to endure in 30 minutes.
Thanks for the stuff to think about! I'll edit when I try some stuff out.
I got it to work by using a function that converts a general purpose surface into a texture. No mater how I reorganized my code though I couldn't get the old one to work in fullscreen. Id like to find out why but I don't really know how so... Im going to go ahead and switch that without understanding why. Thanks for the suggestions and code.
By the way, why waitEvent instead of pollEvent?
Thanks for the stuff to think about! I'll edit when I try some stuff out.
I got it to work by using a function that converts a general purpose surface into a texture. No mater how I reorganized my code though I couldn't get the old one to work in fullscreen. Id like to find out why but I don't really know how so... Im going to go ahead and switch that without understanding why. Thanks for the suggestions and code.
By the way, why waitEvent instead of pollEvent?
The machine does not run without the coin.
Possibly Related Threads...
| Thread: | Author | Replies: | Views: | Last Post | |
| Fast rendering with OpenGL 1.1 | dotbianry | 4 | 1,301 |
Dec 18, 2012 03:58 AM Last Post: dotbianry |
|
| Opengl/Cocoa text rendering | tesil | 15 | 14,444 |
Mar 20, 2012 11:16 AM Last Post: OneSadCookie |
|
| OpenGL Text Rendering (in Cocoa) | daveh84 | 5 | 6,630 |
Feb 19, 2009 12:44 PM Last Post: TomorrowPlusX |
|
| opengl text/font drawing from CGContext | fretmunky | 11 | 11,420 |
Dec 7, 2008 11:29 AM Last Post: fretmunky |
|
| OpenGL text and other things. | Talyn | 7 | 3,934 |
Jul 22, 2008 02:09 AM Last Post: OneSadCookie |
|

