Jump to content
  • Advertisement
Sign in to follow this  
darkgaze

OpenGL SDL_TTF with OpenGL together not working

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

Hello.

Here´s my code. I use SDL_TTF and it worked before. Later on i added lighting and materials, and textures to my scene, and this started to be black for the first time.

But anyways, disabling or enabling them, even glColorMaterial, i get a black surface on the screen. What??. I tried to raise the effect of the ambient light ... maybe it had relation with materials, or something. But nothing happens.

Sorry for the explanations. They are in spanish. :(


//============================================================

void Vista::dibujarTexto(){

// obtengo los valores de GL_Viewport
int vPort[4];
glGetIntegerv(GL_VIEWPORT, vPort);

// guardo la matriz de proyeccion para ponerla a identidad
// y establezco la proyeccion a ortografica con los datos de GL_Viewport
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
glOrtho(0, vPort[2], 0, vPort[3], -1, 1);

// establezco a la identidad la matriz de modelado vista
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();

// desactivo cosas que pueden afectar a la visibilidad
glDisable(GL_DEPTH_TEST);
glDisable(GL_LIGHTING);
glDisable(GL_COLOR_MATERIAL);

// Creo un color y una posicion
SDL_Color color;
color.r = 255;
color.g = 255;
color.b = 255;

// (origen abajo a la izquierda).
// renderizo todos los trozos de texto
SDL_Rect position;
position.x = 10;
position.y = _altoVentana - 35;
renderTexto("RATON y CLICKS rotar y mover -- FLECHAS: deslizar -- NORMALES Y RELLENO: q,w -- PUERTA: g", _fuente, color, &position);
position.y -= position.h;
renderTexto("VISTAS: oblicua i, ortogonal o, perspectiva p. lateral 4, frontal 5, cenital 6, esquina 7.", _fuente, color, &position);
position.y -= position.h;
renderTexto("Luz global: l -- luz focal: k -- luz direccional: j -- niebla: h -- SALIR: Esc o Espacio", _fuente, color, &position);
position.y -= position.h;
renderTexto("Mover lampara: z x -- Escalar lampara: a s -- SALIR: Esc o Espacio", _fuente, color, &position);

// muestra los fps
char str[222];
sprintf(str, "FPS: %f", _fps);
position.y -= position.h;
renderTexto(str, _fuente, color, &position);

// enciendo todo como estaba
glEnable(GL_DEPTH_TEST);
glEnable(GL_LIGHTING);
glEnable(GL_COLOR_MATERIAL);
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
glPopMatrix();


}

//============================================================

void Vista::renderTexto(std::string text,TTF_Font *font,SDL_Color color,
SDL_Rect *const location)
{
// uso SDL_TTF para renderizar el texto en una superficie
const char* text_C = text.c_str();
SDL_Surface *initial = TTF_RenderText_Blended(font, text_C, color);

// convierto el texto a un formato conocido, potencia de 2
int w = round(pow(2,ceil(log(initial->w) / log(2))));
int h = round(pow(2,ceil(log(initial->h) / log(2))));

// creo una superficie RGB intermediaria
SDL_Surface *intermediary = SDL_CreateRGBSurface(0, w, h, 32,
0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000);

// pego la inicial con el texto sobre la intermedia que es la base
SDL_BlitSurface(initial, 0, intermediary, 0);

// creo la textura
GLuint texture = 0;
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexImage2D(GL_TEXTURE_2D, 0, 4, w, h, 0, GL_BGRA,
GL_UNSIGNED_BYTE, intermediary->pixels );
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

// dibujo los cuadrados
glColor3f(0.0f,0.0f,0.0f);

glBegin(GL_QUADS);
glTexCoord2f(0.0f, 1.0f);
glVertex2f(location->x , location->y);
glTexCoord2f(1.0f, 1.0f);
glVertex2f(location->x + w, location->y);
glTexCoord2f(1.0f, 0.0f);
glVertex2f(location->x + w, location->y + h);
glTexCoord2f(0.0f, 0.0f);
glVertex2f(location->x , location->y + h);
glEnd();

//glFinish();

location->w = initial->w;
location->h = initial->h;

// libero los recursos.
SDL_FreeSurface(initial);
SDL_FreeSurface(intermediary);
glDeleteTextures(1, &texture);
}



Share this post


Link to post
Share on other sites
Advertisement
Two things:

You might need to call SDL_SetAlpha(initial, 0, 0) before you blit to the intermediary surface (so that everything is just copied over, not blended).

Are you sure your intermediary surface is BGRA (your masks look more like ARBG)?

Share this post


Link to post
Share on other sites
Hey! nice answers.

I tried the alpha thing. I´ll check if it works later. But tell me... what about the masks? you mean:

SDL_Surface *intermediary = SDL_CreateRGBSurface(0, w, h, 32,
0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000);

I copied the code so i don´t know about this.
Why those masks? are you sure it´s wrong?
ARBG = 0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000

so it should be:

BGRA = 0x000000ff, 0xff000000 , 0x0000ff00, 0x00ff0000 ??

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!