IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

GLUT Discussion :

Affichage de texte - glutBitmapCharacter()


Sujet :

GLUT

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 195
    Points : 82
    Points
    82
    Par défaut Affichage de texte - glutBitmapCharacter()
    Bonjour à tous,

    J'ai parcouru un certain nombre de tutoriaux (notamment sur dev.com) concernant l'affichage de texte avec : glutBitmapCharacter() et l'utilisation de glOrtho[2D]() et glRasterPos2f() ... Mais à l'affichage d'un texte, la fenêtre reste vide !

    ( ce n'est peut être pas l'affichage global qui pose problème vu que j'affiche n'importe quel élément de géométrie )

    Voici la fonction que j'utilise :
    -> la fenêtre est en 800x600 et j'essaie de placer le texte au milieu de la
    fenêtre

    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
    // TEXTE
    inline void Texte ( int x=0, int y=0, char* txt=NULL ){
    
    	glDisable(GL_DEPTH_TEST);
    
    	glMatrixMode( GL_PROJECTION );
    	glPushMatrix();
    	glLoadIdentity();
    
    	glOrtho( -400.0,  400.0,     -300.0,  300.0,      1.0,  100.0 );
    
    	int len = (int) strlen(txt);
    	for (int i = 0; i < len; i++){
                     glutBitmapCharacter( GLUT_BITMAP_HELVETICA_18, txt[i] );
            }
    
    	glPopMatrix();
    	glMatrixMode( GL_MODELVIEW );
    
    	glEnable(GL_DEPTH_TEST);
    }
    Merci pour votre aide!
    Sébastien.

  2. #2
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Bonsoir,

    1) il manque un test qui vérifie si txt n'est pas NULL

    2) un code complet serait mieux, il est difficile de voir si quelque chose d'autre interfère avec l'affichage du texte

    Jc

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 195
    Points : 82
    Points
    82
    Par défaut Texte opengl [2D] - le code complet du test
    Bonjour à tous et à toi Fearyourself,

    Le test était imbriqué dans un moteur fait "maison".
    J'ai recréé un projet avec le minimum requis, le voici :

    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
    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
     
    // *********************************************
    #include <string.h>
    #include "SDL.h"
    #include "glut.h"
    #include "GL\gl.h"
    #include "GL\glext.h"
     
    // fonctions
    void Init(){
    	glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
    	glMatrixMode( GL_MODELVIEW );
    	glLoadIdentity();
    }
     
    void Evenements(){
     
    	SDL_Event event;
     
    	while ( SDL_PollEvent(&event) ){
    		switch ( event.type ){
    			// fins
    			case SDL_QUIT:	 {  SDL_Quit(); } break;
    			case SDL_KEYDOWN:{  SDL_Quit(); } break;
    		}
    	}
    }
     
    void Texte( int x, int y, char* txt ){
     
    	glDisable( GL_DEPTH_TEST );
     
    	glMatrixMode( GL_PROJECTION );
    	glPushMatrix();
    	glLoadIdentity();
     
    	glOrtho( -400.0,  400.0,     -300.0,  300.0,      1.0,  100.0 );
    	glRasterPos2f( x,y );
     
    	int len = (int) strlen(txt);
    	for (int i = 0; i < len; i++){ glutBitmapCharacter( GLUT_BITMAP_HELVETICA_18, txt[i] ); }
     
    	glPopMatrix();
    	glMatrixMode( GL_MODELVIEW );
     
    	glEnable( GL_DEPTH_TEST );
    }
     
     
    // Entry point
    int main( int argc, char *argv[] )
    {
     
    	SDL_Init( SDL_INIT_VIDEO );
    	SDL_SetVideoMode( 800, 600, 32, SDL_OPENGL );
     
    	glViewport		( 0,0, 800,600 );
    	glClearColor	( 0.2f, 0.0f, 0.4f, 0.6f );
    	glClearDepth	( 1.0 );
     
    	glMatrixMode( GL_PROJECTION );
    	glLoadIdentity();
    	gluPerspective	( 45.0f, ((GLfloat) 800 / (GLfloat) 600), 0.1f, 100.0f );
    	glMatrixMode( GL_MODELVIEW );
     
    	glDepthFunc( GL_LESS );
        glEnable( GL_DEPTH_TEST );
        glShadeModel( GL_SMOOTH );
     
    	// ****************************************
    	while ( 1 ){
     
    		Evenements();
     
    		Init();
    		glTranslatef( 0.0f, 0.0f, -15.0f );
     
    		Texte( 400,300, "BONJOUR_A_TOUS !" );
     
    		// redessiner
    		SDL_GL_SwapBuffers();
    	}
     
    	// fin de programme
    	return 0;
    }
    Merci encore,
    Sébastien.

  4. #4
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Merci pour l'exemple minimal, c'est souvent avec cela qu'on trouve tout de suite l'erreur...

    Je vais tout de même commenté tout le code...

    Tes includes sont mieux ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    #include <string.h>
    #include <SDL.h>
    #include <GL/glut.h>
    #include <GL/gl.h>
    #include <GL/glext.h>
    les include " " sont pour ceux dans le répertoire courant.

    Si tu inclus des SDL_Quit quelque part, tu dois t'assurer qu'il n'y aura plus d'appels SDL dans la suite. Or, dans ton code, cela n'est pas vrai. Si tu veux garder ta structure de code, tu dois modifier ta fonction Evenements en :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int Evenements(){
     
        SDL_Event event;
     
        while ( SDL_PollEvent(&event) ){
            switch ( event.type ){
                // fins
                case SDL_QUIT:	 {  SDL_Quit(); } return 1;
                case SDL_KEYDOWN:{  SDL_Quit(); } return 1;
            }
        }
        return 0;
    }
    et dans le main tester le retour (on y viendra...)

    Dans ta fonction Texte, il manque un test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if(txt!=NULL) {
      /* Le reste du code */
    }
    PS: si tu auras des textures dans ton programme, n'oublie pas de désactiver GL_TEXTURE_2D aussi (ou 1D,3D dépendant...)
    Il est aussi bon de sélectionner une couleur avant ou alors tu mets comme condition que la couleur est sélectionnée avant l'appel...

    Dans ton main, il faut appeler glutInit (avant tout appel Glut, il faut appeler glutInit, sinon ton code ne sera pas portable...)

    J'ai changé ton while en modifiant le test comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        while ( Evenements() ){
    et l'erreur fatale (la seule à corriger pour que cela fonctionne (mal par contre ) ) :

    Texte( 400,300, "BONJOUR_A_TOUS !" );

    Si ta vue ortho va de -400,-300 à 400,300. Tu vas avoir du mal à afficher ce texte...

    Solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            Texte( 0,0, "BONJOUR_A_TOUS !" );
    Jc

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 195
    Points : 82
    Points
    82
    Par défaut oui mais...
    Merci Fearyourself,

    Effectivement j'avais un message d'erreur lorsque je quittais le programme!
    J'ai fait ce programme minimal à "l'arrachée"...

    En ce qui concerne le placement du texte j'ai tout essayé:
    glOrtho( 0,800, 0,600, 1, 100 ),
    glOrtho( -1,1, -1,1, 1, 100 ),
    glOrtho( -18,18, -20,20, 1, 100 ),

    rien n'y fait! mon texte centré en 400,300 n'apparait pas! je n'arrive pas à contrôler les coordonnées du texte en x,y.
    (mais par contre celui en 0,0 apparait quelque fois).

    merci pour ton aide,
    Sébastien.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 195
    Points : 82
    Points
    82
    Par défaut >> Probleme Resolu
    Le problème est résolu par l'ajout de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     glutInit( &argc, argv );
    Merci encore à toi Fearyourself,
    de nombreuses heures en moins à chercher dans la direction opposé au problème ! ...

    Sébastien.

  7. #7
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par cyber_N
    Le problème est résolu par l'ajout de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     glutInit( &argc, argv );
    Merci encore à toi Fearyourself,
    de nombreuses heures en moins à chercher dans la direction opposé au problème ! ...

    Sébastien.
    Arg, ca m'apprendra à ne pas mettre le code qui fonctionne, je l'avais mis ce glutInit... Parce qu'avec freeglut, tu es obligé de le faire sinon le programme plante sinon.

    Désolé ,
    Jc

    EDIT : Ah ben non! je l'avais dit :

    Dans ton main, il faut appeler glutInit (avant tout appel Glut, il faut appeler glutInit, sinon ton code ne sera pas portable...)
    Certes pas énorme comme message mais présent tout de même....

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 10
    Dernier message: 08/06/2009, 11h30
  2. Affichage de texte
    Par Yellowmat dans le forum OpenGL
    Réponses: 2
    Dernier message: 15/12/2004, 12h25
  3. [C#] Affichage de texte vertical...
    Par AntiSAL dans le forum Windows Forms
    Réponses: 6
    Dernier message: 10/06/2004, 14h46
  4. Affichage de texte est mise à jour de l'écran
    Par Galdor_sp dans le forum OpenGL
    Réponses: 3
    Dernier message: 14/03/2004, 22h31
  5. [MX 2004] Affichage du texte dynamique
    Par caramel dans le forum Flash
    Réponses: 8
    Dernier message: 29/01/2004, 16h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo