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

OpenGL Discussion :

Convertion SDL_surface TTF en image OpenGL


Sujet :

OpenGL

  1. #1
    Membre confirmé

    Profil pro
    Inscrit en
    Août 2006
    Messages
    213
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 213
    Par défaut Convertion SDL_surface TTF en image OpenGL
    Bonjour,
    Donc voila, j'essai de convertir un code que j'utiliais en SDL pure pour afficher du text avec SDL_ttf, en un code openGL toujour avec SDL_ttf.
    Le problème que je rencontre c'est pour le "glTexImage2D", le prog plante car je ne met probablement pas les bons paramètres dans la fonction, ne connaissant pas le format renvoyé par "TTF_RenderText_Solid".

    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
     
    void Ctext::DrawText(char message[])
    {
     
    //Création de la texture du sprite
        SDL_Surface *temp;
     
        glGenTextures (1, & surface);
        glBindTexture (GL_TEXTURE_2D, surface);
     
        // Paramétrage de la texture.
        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);
        glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
     
        temp = TTF_RenderText_Solid(font, message, color);
     
        // Jonction entre OpenGL et SDL.
        glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, temp->w, temp->h, 0,
        GL_RGBA, GL_UNSIGNED_BYTE, temp -> pixels);
     
        SDL_FreeSurface(temp);
     
    //      (ancien code en SDL pure)
    //	surface=TTF_RenderText_Solid(font, message, color);
    //	SDL_BlitSurface(surface, &rectsrc, Screen, &rectdest);
     
    }

  2. #2
    Membre éprouvé Avatar de razmott
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 133
    Par défaut
    Salut !
    Ton problème provient de l'utilisation de glGenTextures :
    il ne faut pas passer en paramètre un SDL_Surface. Cette fonction requière en effet, un pointeur sur entier non-signé. Tu doit ensuite copier manuellement pixel par pixel, le contenue du SDL_Surface.

    Bon coding !
    @+

  3. #3
    Membre confirmé

    Profil pro
    Inscrit en
    Août 2006
    Messages
    213
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 213
    Par défaut
    Je ne comprend pas trop le problème avec le glgentexure, je l'utilise pour charger des images avec sdl et ensuite les convertir en opengl avec le meme code et sa fonctionne. Peux-tu être plus explicite STP?

  4. #4
    Membre éprouvé Avatar de razmott
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 133
    Par défaut
    Oups !

    J'avais mal lu ton code .
    Par contre je croit que SDL_TTF renvoit une surface en RGB et non en RGBA.
    Ainsi essaie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, temp->w, temp->h, 0,
        GL_RGB, GL_UNSIGNED_BYTE, temp -> pixels);
    Bon courage !

    @+

  5. #5
    Expert confirmé

    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 : 45
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par razmott
    Oups !

    J'avais mal lu ton code .
    Par contre je croit que SDL_TTF renvoit une surface en RGB et non en RGBA.
    Cela est faux. Si on utilise les fonctions TTF_RenderText_Blended, alors on obtient une image RGBA. Dans le cas présent par contre, en effet, un RGB suffit

    Jc

  6. #6
    Membre éprouvé Avatar de razmott
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 133
    Par défaut
    Salut !

    Si on utilise les fonctions TTF_RenderText_Blended, alors on obtient une image RGBA
    Ah !
    Bon, j'aurais appris quelque chose.

    @+

  7. #7
    Membre confirmé

    Profil pro
    Inscrit en
    Août 2006
    Messages
    213
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 213
    Par défaut
    J'ai essayé RGB et RGBA et aucun ne marche...

  8. #8
    Expert confirmé

    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 : 45
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par BruceBoc
    J'ai essayé RGB et RGBA et aucun ne marche...
    Il faudrait un code minimal compilable qui montre ce que tu veux faire, ce sera la façon la plus rapide pour t'aider à ce niveau.

    Jc

  9. #9
    Membre confirmé

    Profil pro
    Inscrit en
    Août 2006
    Messages
    213
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 213
    Par défaut
    voici la classe

    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
     
    class Ctext
    {
     
    	private :
     
    		TTF_Font* font;
    		SDL_Color color;
    		GLuint surface;
    		SDL_Rect rectsrc;
    		SDL_Rect rectdest;
     
    	public :
    		void LoadFont(char police[], int size, int R, int G, int B);
    		void DrawText(char message[]);
    		void DrawText(int number);
    		void SetPosition(int x, int y);
     
    };
    voici les fonctions de la classe :
    ( l'affichage n'a pas encore été codé vu que ça plante déja au chargement du 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
    38
    39
    40
    41
    42
    43
     
    void Ctext::LoadFont(char police[], int size, int R, int G, int B)
    {
     
    	color.r=R;
    	color.g=G;
    	color.b=B;
     
    	font=TTF_OpenFont(police, size);
     
    	rectsrc.x = 0;
    	rectsrc.y = 0;
    	rectsrc.w = 300;
    	rectsrc.h = 70;
     
     
    }
     
     
    void Ctext::DrawText(char message[])
    {
     
    	//Création de la texture du sprite
    	SDL_Surface *temp;
     
    	glGenTextures (1, & surface);
        glBindTexture (GL_TEXTURE_2D, surface);
     
        // Paramétrage de la texture.
        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);
        glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
     
        temp = TTF_RenderText_Solid(font, message, color);
     
        // Jonction entre OpenGL et SDL.
        glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, temp->w, temp->h, 0,
        GL_RGB, GL_UNSIGNED_BYTE, temp -> pixels);
     
    	SDL_FreeSurface(temp);
     
    }
    et voici les fonctions d'initialisation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    	Ctext text;
    	text.LoadFont("times.ttf", 12, 1,0,0);
    	text.DrawText("hello");

  10. #10
    Expert confirmé

    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 : 45
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    - Ok où est le test sur le retour de TTF_OpenFont ?
    - Où est le test en sur la valeur de font avant d'appeler TTF_RenderText_Solid ?
    - As-tu bien le times.ttf dans le répertoire courant ?

    Jc

  11. #11
    Membre confirmé

    Profil pro
    Inscrit en
    Août 2006
    Messages
    213
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 213
    Par défaut
    Bête comme je suis, j'avais tout simplement oublié le "TTF_Init();"
    Merci à tous et désolé de vous avoir fait perdre du temps.

  12. #12
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Bête comme je suis, j'avais tout simplement oublié le "TTF_Init();"
    D'où l'intérêt de vérifier le retour de chaque fonction

    N'oublie pas de cliquer un petit coup sur

  13. #13
    Membre confirmé

    Profil pro
    Inscrit en
    Août 2006
    Messages
    213
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 213
    Par défaut
    Oui c'est vrai, c'est une habitude que je n'ai pas encore prise.

  14. #14
    Membre confirmé

    Profil pro
    Inscrit en
    Août 2006
    Messages
    213
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 213
    Par défaut
    Euh en fait, ça plante plus, mais au lieu de m'afficher du text, il m'affiche juste un rectangle tout blanc.
    Voici la fonction "DrawText" ou j'ai rajouté l'affichage :

    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
     
    void Ctext::DrawText(char message[])
    {
     
    	//Création de la texture du sprite
    	SDL_Surface *temp;
     
    	glGenTextures (1, & surface);
        glBindTexture (GL_TEXTURE_2D, surface);
     
        // Paramétrage de la texture.
        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);
        glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
     
    	//temp = TTF_RenderText_Solid(font, message, color);
    	temp = TTF_RenderText_Solid(font, message, color);
     
        // Jonction entre OpenGL et SDL.
        glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, temp->w, temp->h, 0,
        GL_RGBA, GL_UNSIGNED_BYTE, temp-> pixels);
     
    	SDL_FreeSurface(temp);
     
    	glEnable(GL_ALPHA_TEST);
     
    	    glBegin(GL_QUADS);
     
            glTexCoord2f (0, 0);
    		glVertex2f(rectdest.x, rectdest.y);
     
            glTexCoord2f (0, 1);
    		glVertex2f(rectdest.x, rectdest.y + rectsrc.h);
     
            glTexCoord2f (1, 1);
    		glVertex2f(rectdest.x + rectsrc.w, rectdest.y + rectsrc.h);
     
            glTexCoord2f (1, 0);
    		glVertex2f(rectdest.x + rectsrc.w, rectdest.y);
     
        glEnd();
     
    }

  15. #15
    Expert confirmé

    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 : 45
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par BruceBoc
    Euh en fait, ça plante plus, mais au lieu de m'afficher du text, il m'affiche juste un rectangle tout blanc.
    Il faut en principe que l'image soit de dimension en puissance de 2.

    Ou alors passer par les textures Mipmap...

    Jc

  16. #16
    Membre confirmé

    Profil pro
    Inscrit en
    Août 2006
    Messages
    213
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 213
    Par défaut
    Oui c'est exact à moins d'avoir une CG récente.
    Mais dans ce cas la je ne sais pas comment avoir une image puissance de 2 vu que lorsque je fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    temp = TTF_RenderText_Solid(font, message, color);
     
    // Jonction entre OpenGL et SDL.
    glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, temp->w, temp->h, 0,
    GL_RGBA, GL_UNSIGNED_BYTE, temp-> pixels);
    je ne controle pas la taille de l'image renvoyée par TTF_RenderText_Solid...

  17. #17
    Expert confirmé

    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 : 45
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    - Soit tu complétes l'image avec de la transparence

    - Soit tu passes par des mipmaps...

    Jc

  18. #18
    Membre confirmé

    Profil pro
    Inscrit en
    Août 2006
    Messages
    213
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 213
    Par défaut
    Oui, mais quelle est la méthode dois-je utiliser pour agouter de la transparance???

  19. #19
    Expert confirmé

    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 : 45
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par BruceBoc
    Oui, mais quelle est la méthode dois-je utiliser pour agouter de la transparance???
    - Tu crées une surface d'une taille de puissance de 2 et tu fais une copie des pixels

    - Mais pourquoi ne pas utiliser la solution des mipmaps ?

    Jc

  20. #20
    Membre confirmé

    Profil pro
    Inscrit en
    Août 2006
    Messages
    213
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 213
    Par défaut
    Peut-tu etre plus précis sur la façon de copier les pixels dans une 2è texture, car j'ai essayé sans succés cette fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
        SDL_Surface *temp2=SDL_CreateRGBSurfaceFrom(
    	temp->pixels,
        512,
        512,
        temp->format->BitsPerPixel,
        temp->pitch,
        temp->format->Rmask,
        temp->format->Gmask,
        temp->format->Bmask,
        temp->format->Amask);
    Et pour la solution des mipmaps, je ne connais pas cette technique, en quoi consiste-elle?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 3 123 DernièreDernière

Discussions similaires

  1. Convertion document HTML en image
    Par enusius dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 25/09/2013, 20h05
  2. Réponses: 1
    Dernier message: 06/06/2010, 11h53
  3. Probleme d'affichage image OpenGL
    Par nonolerobot77 dans le forum GLUT
    Réponses: 2
    Dernier message: 22/02/2008, 12h54
  4. Traitement image OpenGL
    Par LEK dans le forum OpenGL
    Réponses: 2
    Dernier message: 02/11/2006, 09h28

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