bonjour tout le monde !
comme à ma grande habitude je me pose des questions existentielle dans le développement en tout genre, c'est donc suite à cette série de questions que je suis amené auprès de ce merveilleux forum pour la Nième fois
bon ! pour écourter ce topic, je fais de l'affichage de texte 2D en openGL (jusque là rien de surprenant).
j'utilise une méthode traditionnelle sans glut, ou autre lib additionnelle, qui consiste a découper un fragment de texture contenant tout mon alphabet (et un peu plus), puis de l'apposer sur un Quad pour enfin créer une image aux allures de caractère alphabétique
c'est là que mon problème se pose, plus les caractères sont petits, plus ils apparaissent flou.
je suppose donc que cela vient soit :
- d'un filtrage des textures lors de leur affichage
- d'un filtrage lors de la création de la texture (sachant que ma texture est parfaite sous mon éditeur d'image, je parle donc du chargement sous OpenGL)
voici en premier lieu ma fonction de chargement d'image, elle est faite maison, et est inspirée d'à peu près tout les tuto trouvé sur le Net
(il est a noter que ma lib de fenêtrage et d'événement est SDL)
puis une ébauche de ma fonction d'affichage de texte
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37 GLuint LoadTexture(const char *path) { SDL_Surface* surface = IMG_Load(path); GLuint texture = 0; if (surface) { SDL_Surface* fliped_surface = SDL_CreateRGBSurface(SDL_SWSURFACE, surface->w,surface->h, surface->format->BitsPerPixel, surface->format->Rmask, surface->format->Gmask, surface->format->Bmask, surface->format->Amask); SDL_LockSurface(surface); SDL_LockSurface(fliped_surface); int pitch = surface->pitch; for (int current_line = 0; current_line < surface->h; ++current_line) memcpy(&((unsigned char*)fliped_surface->pixels)[current_line * pitch], &((unsigned char*)surface->pixels)[(surface->h - 1 - current_line) * pitch], pitch); SDL_UnlockSurface(fliped_surface); SDL_UnlockSurface(surface); SDL_FreeSurface(surface); surface = fliped_surface; glGenTextures(1, &texture); glBindTexture(GL_TEXTURE_2D, texture); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); if (surface->format->BitsPerPixel == 32) glTexImage2D(GL_TEXTURE_2D, 0, 4, surface->w, surface->h, 0, GL_RGBA, GL_UNSIGNED_BYTE, surface->pixels); else glTexImage2D(GL_TEXTURE_2D, 0, 3, surface->w, surface->h, 0, GL_RGB, GL_UNSIGNED_BYTE, surface->pixels); SDL_FreeSurface(surface); } else std::cerr << "Error: " << path << " file dosen't exists" << std::endl; return (texture); }
bon j'espère que tout ce code vous permettra de comprendre comment je fonctionne, et si vous pouviez m'aider, ou simplement m'expliquer pourquoi des petites Font deviennent flou, vous me seriez d'une grande aide.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52 //Start 2D glDisable(GL_DEPTH_TEST); glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); gluOrtho2D(0, width, 0, height); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); glEnable(GL_BLEND); glEnable(GL_COLOR_MATERIAL); glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, _tex[id]); for (int i = 0; i < len; ++i) { /*codecodecode*/ glPushMatrix(); glRotated(disp->rot, 0, 0, 1); glTranslated(trans * disp->size, -col * disp->size, 0); glBegin(GL_QUADS); glColor4ub(tmpColor.R, tmpColor.G, tmpColor.B, tmpColor.A); glTexCoord2d(ax * lx, (_numCharByCol - 1 - ay) * ly); glVertex2d(disp->x, disp->y); glTexCoord2d(ax * lx, (_numCharByCol - ay) * ly); glVertex2d(disp->x, disp->size * STRHEIGHTRATIO + disp->y); glTexCoord2d((ax + 1.0 ) * lx, (_numCharByCol - ay) * ly); glVertex2d(disp->size + disp->x, disp->size * STRHEIGHTRATIO + disp->y); glTexCoord2d((ax + 1.0 ) * lx, (_numCharByCol - 1 - ay) * ly); glVertex2d(disp->size + disp->x, disp->y); glEnd(); glPopMatrix(); } glBindTexture(GL_TEXTURE_2D, NULL); glDisable(GL_TEXTURE_2D); glDisable(GL_COLOR_MATERIAL); glDisable(GL_BLEND); //Stop 2D glMatrixMode(GL_PROJECTION); glPopMatrix(); glMatrixMode(GL_MODELVIEW); glPopMatrix(); glEnable(GL_DEPTH_TEST);
pour finir voici l'image que je map pour mes caractères
EDIT : oups ! l'image est en png avec un canal Alpha, donc du blanc sur blanc, c'est pas terrible pour voir
merci
Partager