2016-08-03 3 views
0

Je suis un débutant dans OpenGL et j'ai créé une fonction pour écrire du texte dans OpenGL en utilisant SDL_TTF. Voici le code de ma fonction:Texte en OpenGL en utilisant SDL_TTF

#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 parce que quand je l'utilise, il dessine un rectangle qui est la couleur de color à l'endroit où le texte devrait être. Que dois-je changer dans mon code pour que cela fonctionne?

+0

Désolé, mais je pense que vous devriez d'abord en apprendre davantage sur OpenGL avant d'essayer de faire ce qui tente actuellement. Tout d'abord, OpenGL n'a pas de fonctions textuelles, pas d'OpenGL moderne. De plus, vous ne devriez pas utiliser cet ancien OpenGL 1.1 avec son pipeline de fonctions fixes. C'est définitivement complètement obsolète. Et je n'ai jamais vu glVertex2px auparavant. Aussi, je ne peux pas trouver quelque chose à ce sujet. Donc, finalement, il est difficile de dire ce qui ne va pas dans ce contexte sans plus d'informations. Peut-être que vous avez mal configuré la matrice ModelView/Projection pour que vous ne puissiez voir qu'une petite partie de l'ensemble? – Michael

+0

@Michael A propos de 'glVertex2px', c'est une macro que j'ai créée moi-même et qui dessine des choses en utilisant le nombre de pixels du coin supérieur gauche de la fenêtre comme dans SDL. En 2D, je trouve cela plus pratique. J'ai oublié d'inclure sa définition dans le code, mais j'ai édité pour corriger cela. –

Répondre

2

La texture obtenue est remplie de couleur unie. Ce qui fait qu'il forme le texte est le canal alpha, mais vous n'avez pas d'alpha blending activé donc vous ne le voyez pas. Ajouter

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

ou au moins test alpha (produira des contours plus nets en raison du manque de mélange - pour certaines polices il encore mieux de cette façon).

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