Précédent   Forum des professionnels en informatique > Applications > Développement 2D, 3D et Jeux > API graphiques > OpenGL
OpenGL Forum d'entraide sur le développement en OpenGL. Avant de poster -> FAQ OpenGL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 23/10/2011, 13h07   #1
Invité régulier
 
Sebastien
Étudiant
Inscription : novembre 2008
Messages : 40
Détails du profil
Informations personnelles :
Nom : Sebastien

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : novembre 2008
Messages : 40
Points : 8
Points : 8
Par défaut OpenGl - affichage de texte

Bonjour,

J'ai un soucis avec le tuto 13 de Nehe pour afficher du texte 2D sur une fenêtre.
J'utilise le C, sous code blocks et windows, ma police se trouve bien dans le répertoire source et binaire..

Je ne vois pas du tout de quoi ça peut venir, j'ai réduis mon code au minimum pour ne mettre en valeur que la partie du tuto.. Mais rien à l'écran...
Code :
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
 
#include <windows.h>
#include <SDL/SDL.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <SDL/SDL_ttf.h>
 
GLuint Nom ;
GLuint  base;                           // Base Display List For The Font Set
HDC                     hDC=NULL;               // Private GDI Device Context
GLfloat cnt1;                           // 1st Counter Used To Move Text & For Coloring
GLfloat cnt2;                           // 2nd Counter Used To Move Text & For Coloring
 
 
void KillFont() {
        glDeleteLists(base, 96);                                                        // Delete All 96 Characters
}
 
void BuildFont(){
        HFONT font;     // Windows Font ID
        HFONT oldfont; // Used For Good House Keeping
        base= glGenLists(96); // Storage For 96 Characters
 
        font= CreateFont(-24,0,0,0,FW_BOLD,FALSE,FALSE,FALSE,ANSI_CHARSET,OUT_TT_PRECIS,CLIP_DEFAULT_PRECIS,
                        ANTIALIASED_QUALITY,FF_DONTCARE|DEFAULT_PITCH,"arial");
 
        oldfont = (HFONT)SelectObject(hDC, font);               // Selects The Font We Want
        wglUseFontBitmaps(hDC, 32, 96, base);                           // Builds 96 Characters Starting At Character 32
        SelectObject(hDC, oldfont);                                                     // Selects The Font We Want
        DeleteObject(font);                                                                     // Delete The Font
}
 
void glPrint(const char *fmt, ...){
        char text[256];                                                         // Holds Our String
        va_list ap;                                                                             // Pointer To List Of Arguments
 
        if (fmt == NULL)                                                                        // If There's No Text
                return;                                                                                 // Do Nothing
 
        va_start(ap, fmt);                                                                      // Parses The String For Variables
                vsprintf(text, fmt, ap);                                                // And Converts Symbols To Actual Numbers
        va_end(ap);                                                                                     // Results Are Stored In Text
 
        glPushAttrib(GL_LIST_BIT);                                                      // Pushes The Display List Bits
        glListBase(base - 32);                                                          // Sets The Base Character to 32
        glCallLists(strlen(text), GL_UNSIGNED_BYTE, text);      // Draws The Display List Text
        glPopAttrib();                                                                          // Pops The Display List Bits
}
 
int initialisation(){
 
glViewport(0,0,640,480);                                                // Reset The Current Viewport
 
        glMatrixMode(GL_PROJECTION);                                            // Select The Projection Matrix
        glLoadIdentity();                                                                       // Reset The Projection Matrix
 
         gluPerspective(80,640/480,0.0001f,100.0f);
 
        glMatrixMode(GL_MODELVIEW);                                                     // Select The Modelview Matrix
        glLoadIdentity();
 
         glShadeModel(GL_SMOOTH);               // Enable Smooth Shading
        glClearColor(0.0f, 0.0f, 0.0f, 0.5f);           // Black Background
        glClearDepth(1.0f);                     // Depth Buffer Setup
        glEnable(GL_DEPTH_TEST);                // Enables Depth Testing
        glDepthFunc(GL_LEQUAL);                 // The Type Of Depth Testing To Do
        glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);  // Really Nice Perspective Calculations
 
        BuildFont();
        return 0;
}
 
 
 
 
int DrawGLScene(){printf("draw\n");
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);     // Clear Screen And Depth Buffer
        glLoadIdentity();                                                                       // Reset The Current Modelview Matrix
        glTranslatef(0.0f,0.0f,-1.0f);                                          // Move One Unit Into The Screen
        // Pulsing Colors Based On Text Position
        glColor3f(1.0f,1.0f,1.0f);
        // Position The Text On The Screen
        glRasterPos2f(-0.45f+0.05f*(float)(cos(cnt1)), 0.32f*(float)(sin(cnt2)));
        glPrint("Active OpenGL Text With NeHe - %7.2f", cnt1);  // Print GL Text To The Screen
        cnt1+=0.051f;                                                                           // Increase The First Counter
        cnt2+=0.005f;                                                                           // Increase The First Counter
        return TRUE;                                                                            // Everything Went OK
}
 
 
/// ********************************************************************************************MAIN
int main(int argc, char *argv[]){
 
        SDL_Init(SDL_INIT_VIDEO);
        SDL_WM_SetCaption("Gestion des palettes",NULL);
        /*ecran =*/  SDL_SetVideoMode(640, 480, 32, SDL_OPENGL);
        SDL_EnableKeyRepeat(10,10);
 
        bool continuer = true;
        SDL_Event event;
        initialisation();
        while (continuer){
 
        //Draw_3D();
        //Draw_2D();
        DrawGLScene();
        SDL_WaitEvent(&event);
        switch(event.type){
                case SDL_QUIT:
                break;
                case SDL_KEYUP:
                switch (event.key.keysym.sym){
                        case SDLK_ESCAPE:
                        letsexit = 1; printf("évènement SDL: QUITTER\n"); exit(0);
                        break;
                        case SDLK_1:
                        caisse1 = 1;
                        //create_palette(1);
                        printf("évènement SDL: ajouter une caisse en 1 \n");
                        break;
                        case SDLK_2:
                        caisse2 = 1;
                        //create_palette(2);
                        printf("évènement SDL: ajouter une caisse en 2 \n");
                        break;
                        case SDLK_3:
                        caisse3 = 1;
                        //create_palette(3);
                        printf("évènement SDL: ajouter une caisse en 3\n");
                        break;
                        case SDLK_r: printf("reset\n");
                        reset = 1;
                        break;
                        default:
                        break;
                }
        }
 
 
        SDL_GL_SwapBuffers();
        }
 
        //TTF_CloseFont(police);
        TTF_Quit();
        SDL_Quit(); /// arrêt de la SDL
        return 0;
}
Si vous avez des idées... ( d'autant plus que rien ne s'affiche non plus avec la SDL )
skyzomik est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/10/2011, 16h12   #2
Membre Expert
 
Homme Sylvain DOREMUS
Ingénieur - Développeur
Inscription : juin 2005
Messages : 534
Détails du profil
Informations personnelles :
Nom : Homme Sylvain DOREMUS
Âge : 30
Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Ingénieur - Développeur
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juin 2005
Messages : 534
Points : 1 066
Points : 1 066
Envoyer un message via MSN à dragonjoker59
As-tu essayé ce code minimal pour rendre du texte de la manière que tu veux utiliser ?
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
HDC    hdc; 
HGLRC  hglrc; 
 
// create a rendering context  
hglrc = wglCreateContext (hdc); 
 
// make it the calling thread's current rendering context  
wglMakeCurrent (hdc, hglrc); 
 
// now we can call OpenGL API  
 
// make the system font the device context's selected font  
SelectObject (hdc, GetStockObject (SYSTEM_FONT)); 
 
// create the bitmap display lists  
// we're making images of glyphs 0 thru 254  
// the display list numbering starts at 1000, an arbitrary choice  
wglUseFontBitmaps (hdc, 0, 255, 1000); 
 
// display a string:  
// indicate start of glyph display lists  
glListBase (1000); 
// now draw the characters in a string  
glCallLists (24, GL_UNSIGNED_BYTE, "Hello Windows OpenGL World");
__________________
Si vous ne trouvez plus rien, cherchez autre chose...

Chef de projet (et unique exécutant pour l'instant) pour Castor 3D
dragonjoker59 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/10/2011, 20h03   #3
Invité régulier
 
Sebastien
Étudiant
Inscription : novembre 2008
Messages : 40
Détails du profil
Informations personnelles :
Nom : Sebastien

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : novembre 2008
Messages : 40
Points : 8
Points : 8
Ça ne fonctionne pas non plus...

D'autres idées ? !
skyzomik est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/10/2011, 20h10   #4
Expert Confirmé
 
nicolas
Développeur de jeux vidéo
Inscription : août 2007
Messages : 2 167
Détails du profil
Informations personnelles :
Nom : nicolas
Âge : 31
Localisation : Suède

Informations professionnelles :
Activité : Développeur de jeux vidéo
Secteur : Arts - Culture

Informations forums :
Inscription : août 2007
Messages : 2 167
Points : 3 817
Points : 3 817
c'est quoi "ca ne fonctionne pas"? des erreurs a la compil, un crash, une erreur, un ecran noir?
screetch est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/10/2011, 20h11   #5
Expert Confirmé
 
nicolas
Développeur de jeux vidéo
Inscription : août 2007
Messages : 2 167
Détails du profil
Informations personnelles :
Nom : nicolas
Âge : 31
Localisation : Suède

Informations professionnelles :
Activité : Développeur de jeux vidéo
Secteur : Arts - Culture

Informations forums :
Inscription : août 2007
Messages : 2 167
Points : 3 817
Points : 3 817
ah pardon tu as dit rien a l'écran.
Si tu affiches un triangle coloré en plus de ton texte, ca marche?
screetch est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/10/2011, 20h38   #6
Invité régulier
 
Sebastien
Étudiant
Inscription : novembre 2008
Messages : 40
Détails du profil
Informations personnelles :
Nom : Sebastien

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : novembre 2008
Messages : 40
Points : 8
Points : 8
Oui oui j'ai bien la 3D qui s'affiche..
J'affiche un carré avec texture en utilisant les vertex array et pas de soucis de ce coté là.
Donc rien à l'écran au niveau écriture avec ou sans dessin opengl
skyzomik est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/10/2011, 20h53   #7
Expert Confirmé
 
nicolas
Développeur de jeux vidéo
Inscription : août 2007
Messages : 2 167
Détails du profil
Informations personnelles :
Nom : nicolas
Âge : 31
Localisation : Suède

Informations professionnelles :
Activité : Développeur de jeux vidéo
Secteur : Arts - Culture

Informations forums :
Inscription : août 2007
Messages : 2 167
Points : 3 817
Points : 3 817
tu as verifié que tes font etaient bien chargées ? (il y a deux appels qui renvoient un hfont ou quelque chose de similaire)
screetch est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/11/2011, 14h31   #8
Invité régulier
 
Saga Eterna
Inscription : février 2011
Messages : 8
Détails du profil
Informations personnelles :
Nom : Saga Eterna

Informations forums :
Inscription : février 2011
Messages : 8
Points : 7
Points : 7
Bonjour,

La fonction CreateFont utilise les fonts qui sont dans le répertoire windows et enregistrées par le système.
Si tu veux utiliser un font qui est dans un autre répertoire (en l'occurrence celui de ton programme) tu dois d'abord l'enregistrer avec la fonction AddFontResource.

Par contre, pourquoi inclues-tu SDL_ttf si tu charges tes fonts avec les fonctions Win32?

Stéphane
SagaEterna est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/11/2011, 14h26   #9
Invité régulier
 
Sebastien
Étudiant
Inscription : novembre 2008
Messages : 40
Détails du profil
Informations personnelles :
Nom : Sebastien

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : novembre 2008
Messages : 40
Points : 8
Points : 8
Citation:
Envoyé par SagaEterna Voir le message

Par contre, pourquoi inclues-tu SDL_ttf si tu charges tes fonts avec les fonctions Win32?
J'avais juste essayé d'écrire en 2D avec la sdl juste avant..

J'ai plus ou moins tout essayé, je laisse ça en stand by pour le moment pour ne pas perdre mon temps sur ce problème..

A bientôt !
skyzomik est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/11/2011, 19h49   #10
Membre habitué
 
Homme
Étudiant
Inscription : juin 2009
Messages : 155
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 21

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2009
Messages : 155
Points : 102
Points : 102
Les display list sont en deprecated, et donc certain drivers ne les prends plus en charges. Ou même juste un rendu en core profile suffit pour qu'elles ne fonctionnent plus. Or cette technique utilise exclusivement les displays lists, d'ou le pourquoi çà ne fonctionne pas ...

La solution est d'utilisé une texture avec tout les caractères dessus, et ensuite, à partir de ta chaine de caractère, tu crée un tableau de vertices : des triangles avec les coordonné de textures bien spécifique à chaque lettre et tu fais le rendu ensuite.

Voici un petit exemple de texture (google est ton amis)

LastSpear est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/11/2011, 19h53   #11
Invité régulier
 
Sebastien
Étudiant
Inscription : novembre 2008
Messages : 40
Détails du profil
Informations personnelles :
Nom : Sebastien

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : novembre 2008
Messages : 40
Points : 8
Points : 8
Wow..

Je comprends bien le truc, mais...
J'aurais quand méme eut plusieurs trucs à afficher et parfois dynamiquement..
C'est du gros bricolage là !
skyzomik est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/11/2011, 20h04   #12
Membre habitué
 
Homme
Étudiant
Inscription : juin 2009
Messages : 155
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 21

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2009
Messages : 155
Points : 102
Points : 102
Citation:
C'est du gros bricolage là
En effet, l'utilisation des display lists est un gros bricolage

En faite, c'est assez simple, une chaine de caractères est en fait un tableau de char, la plupart du temps compris entre 0 et 127. donc si tu veux les coordonnées de ta lettre dans la texture tu fais un petit algorithme du type :

Code :
1
2
3
4
5
6
7
8
9
10
11
 
const char * MaChainedeCaracter = "Hello World !" ;
float UvX ; // coordoné de la texture sur l'axe des X
float UvY ; // coordoné de la texture sur l'axe des Y
 
for ( int i = 0 ; i < strlen(MaChainedeCaracter) ; i ++ )
{
       UvX = (float)(MaChainedeCaracter[i] % 16) / 16.0f ;
       UvY = 1.0f - (float)(MaChainedeCaracter[i] / 16) / 16.0f ;
 
}
Citation:
J'aurais quand même eu plusieurs trucs à afficher et parfois dynamiquement..
Pas compris ... explique toi un peu plus veux-tu ?!
LastSpear est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 14/11/2011, 00h40   #13
Invité régulier
 
Sebastien
Étudiant
Inscription : novembre 2008
Messages : 40
Détails du profil
Informations personnelles :
Nom : Sebastien

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : novembre 2008
Messages : 40
Points : 8
Points : 8
Citation:
Envoyé par LastSpear Voir le message
[/code]Pas compris ... explique toi un peu plus veux-tu ?!
Avec les détails que tu a donné au dessus, ça ne veux plus rien dire..
Je voyais ça différemment en un peu plus compliqué..
Mais ça reste quand même un peu.. bricolé
Il faut passer en 2D, faire son petit carré au bon endroit.. mettre la texture etc..

Je vais pas me lancer la dedans sachant que je suis limité niveau temps..
Merci beaucoup pour la solution, je la garde dans un coin de ma tête
skyzomik est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2012, 19h29   #14
Invité régulier
 
Sebastien
Étudiant
Inscription : novembre 2008
Messages : 40
Détails du profil
Informations personnelles :
Nom : Sebastien

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : novembre 2008
Messages : 40
Points : 8
Points : 8
Finalement j'avais réussis à régler le soucis, j'ai pu écrire avec SDL TTF
le dernier paramètre a été modifié:

SDL_SetVideoMode(largeur_ecran, hauteur_ecran, 32, SDL_OPENGLBLIT /*SDL_OPENGL*/);
skyzomik est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 11h39.


 
 
 
 
Partenaires

Hébergement Web