Texte en OpenGL avec SDL_TTF

Je suis un débutant dans OpenGL et j’ai créé une fonction pour écrire du texte dans OpenGL à l’aide de SDL_TTF. Voici le code pour ma fonction:

#define WINDOW_WIDTH 832 #define WINDOW_HEIGHT 487 #define glVertex2px(x,y) glVertex2d((double)(x) * 2.0 / (double)WINDOW_WIDTH - 1.0, 1.0 - (double)(y) * 2.0 / (double)WINDOW_HEIGHT); void glWriteText2d(TTF_Font *font,const char *text,SDL_Color color,const int x,const int y){ GLuint texture; SDL_Surface *surface; surface = TTF_RenderText_Blended(font,text,color); glGenTextures(1,&texture); glBindTexture(GL_TEXTURE_2D,texture); gluBuild2DMipmaps(GL_TEXTURE_2D,4,surface->w,surface->h,GL_RGBA,GL_UNSIGNED_BYTE,surface->pixels); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT); GLboolean textureIsEnabled = glIsEnabled(GL_TEXTURE_2D); glEnable(GL_TEXTURE_2D); glColor3ub(255,255,255); glBegin(GL_QUADS); glTexCoord2f(0,0); glVertex2px(x,y); glTexCoord2f(0,1); glVertex2px(x,y + surface->h); glTexCoord2f(1,1); glVertex2px(x + surface->w,y + surface->h); glTexCoord2f(1,0); glVertex2px(x + surface->w,y); glEnd(); if(!textureIsEnabled){ glDisable(GL_TEXTURE_2D); } } 

Cette fonction ne fonctionne pas car lorsque je l’utilise, elle dessine un rectangle qui est la couleur de la color à l’endroit où le texte devrait être. Que dois-je changer dans mon code pour qu’il fonctionne?

La texture obtenue est remplie de couleur unie. Ce qui en fait la forme du texte est le canal alpha, mais vous n’avez pas de fusion alpha activée, vous ne la voyez donc pas. Ajouter

 glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

ou au moins un test alpha (produira des bords plus nets en raison du manque de fondu – pour certaines fonts, il aura même un meilleur rendu de cette façon).

Notez également que vous n’avez pas libéré ni la SDL_Surface générée SDL_Surface ni la texture GL; De cette façon, vous manquerez rapidement de mémoire. La texture peut être réutilisée et SDL_Surface peut être libéré dès que vous avez copié des données dans une texture GL.