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. #41
    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
    Ici, le nom de la fonction est createRGBsurface, mais peut créer avec une surface RGBA, car on spécifie bien un canal alpha. Dans ce cas dois-je mettre 32 bits pour le 4è argument,et qu'elle valeur dois-je mettre dans le alpha, car pour moi ce serait 0,0,0 pour specifier noir mais là il n'y a qu'1 valeur...
    En effet, il faut mettre 32. Par contre, pour le canal alpha, le système est : tu utilises les canaux RGB pour spécifier la couleur et le canal alpha donne l'opacité.

    La valeur alpha dit donc si c'est transparent ou entièrement opaque ou entre les deux .

    Il n'existe pas vraiment de convention donc c'est comme tu préféres. Moi je mets généralement la transparence à 1 pour le canal alpha et 0 représente donc un pixel entièrement opaque.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        glTexImage2D (GL_TEXTURE_2D, 0, GL_RGB, temp2->w, temp2->h, 24,
                        GL_RGB, GL_UNSIGNED_BYTE, temp2->pixels);
    Le 2è argument correspont'il au nombre de bits total, ou par canal?
    Non justement le deuxième paramétre correspond au niveau de détail pour les mipmaps que tu ne voulais pas utiliser

    En fait, il faut mettre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
                    // Jonction entre OpenGL et SDL.
                    glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, temp2->w, temp2->h, 0,
                                    GL_RGBA, GL_UNSIGNED_BYTE, temp2->pixels);
    (remarque, de temps en temps faut mettre GL_BGRA...)

    Bref, une version possible serait donc :

    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
    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
     
    #include "main.h"
     
    static int puissance2sup(int i)
    {
        double logbase2 = log(i) / log(2);
        return round(pow(2.0, ceil(logbase2)));
    }
     
    bool Ctext::LoadFont(string police, int size, int R, int G, int B)
    {
    	color.r=R;
    	color.g=G;
    	color.b=B;
     
    	font = TTF_OpenFont(police.c_str(), size);
        if(font==NULL) {
            return false;
        }
    	rectsrc.x = 0;
    	rectsrc.y = 0;
    	rectsrc.w = 100;
    	rectsrc.h = 70;
     
        return true;
    }
     
     
    bool Ctext::DrawText(string message)
    {
        if(message != this->message) {
            if(this->message != "") {
                glDeleteTextures(1,&surface);
            }
     
            this->message = message;
     
            if(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_Blended(font, message.c_str(), color);
     
                if(temp != NULL) {
                    //Calcul de taille
                    int w = puissance2sup(temp->w);
                    int h = puissance2sup(temp->h);
     
                    SDL_Surface *temp2=SDL_CreateRGBSurface(
                        SDL_HWSURFACE,
                        w,
                        h,
                        32,
                        temp->format->Rmask,
                        temp->format->Gmask,
                        temp->format->Bmask,
                        temp->format->Amask);
     
                    if(temp2 == NULL) {
                        SDL_FreeSurface(temp);
                        return false;
                    }
                    maxx = temp->w;
                    maxx /= w;
                    maxy = temp->h;
                    maxy /= h;
     
                    SDL_BlitSurface(temp, NULL, temp2, &rectsrc);
     
                    // Jonction entre OpenGL et SDL.
                    glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, temp2->w, temp2->h, 0,
                                    GL_RGBA, GL_UNSIGNED_BYTE, temp2->pixels);
     
                    SDL_FreeSurface(temp);
                    SDL_FreeSurface(temp2);
                }
                else {
                    return false;
                }
            }
        }
     
    	glEnable(GL_ALPHA_TEST);
    	glBlendFunc(GL_ONE,GL_ONE);
    	glEnable(GL_BLEND);
    	glAlphaFunc(GL_LESS,0.9);
        glEnable(GL_TEXTURE_2D);
        glBegin(GL_QUADS);
            glTexCoord2f (0, 0);
    		glVertex2f(rectdest.x, rectdest.y);
     
            glTexCoord2f (0, maxy);
    		glVertex2f(rectdest.x, rectdest.y + rectsrc.h);
     
            glTexCoord2f (maxx, maxy);
    		glVertex2f(rectdest.x + rectsrc.w, rectdest.y + rectsrc.h);
     
            glTexCoord2f (maxx, 0);
    		glVertex2f(rectdest.x + rectsrc.w, rectdest.y);
        glEnd();
    }
     
     
     
    void Ctext::SetPosition(int x, int y)
    {
    	rectdest.x = x;
    	rectdest.y = y;
    }
    pour le .cpp

    et :

    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 :
            string message;
            float maxx, maxy;
            GLuint surface;
     
    		TTF_Font* font;
    		SDL_Color color;
    		SDL_Rect rectsrc;
    		SDL_Rect rectdest;
     
    	public :
    		bool LoadFont(string police, int size, int R, int G, int B);
    		bool DrawText(string message);
    		void SetPosition(int x, int y);
     
    };
    pour le .h...

    Remarque ma solution pour ne charger l'image qu'une seule fois si le message n'a pas changé

    Jc

  2. #42
    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 !

    Fearyourself, je viens enfin de comprendre ton code !

    Pour info, je crois que si les masques sont placés à zéro, SDL les met tout seul à la bonne valeur. Voilà. Enfin à vérifier.

    Bon coding à tous !
    @+

  3. #43
    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 quelques erreurs à la compilation de ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    error C2065: 'round' : undeclared identifier
    J'ai cherché mais je n'ai pas trouvé de librairie contenant cette fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    C:\Documents and Settings\Alex\Bureau\OpenGl et SDL_ttf\Ctext.cpp(30) : error C2678: binary '!=' : no operator defined which takes a left-hand operand of type 'class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >' 
    (or there is no acceptable conversion)
    C:\Documents and Settings\Alex\Bureau\OpenGl et SDL_ttf\Ctext.cpp(31) : error C2678: binary '!=' : no operator defined which takes a left-hand operand of type 'class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >' 
    (or there is no acceptable conversion)
    C:\Documents and Settings\Alex\Bureau\OpenGl et SDL_ttf\Ctext.cpp(37) : error C2678: binary '!=' : no operator defined which takes a left-hand operand of type 'class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >' 
    (or there is no acceptable conversion)
    La je sais pas trop...

  4. #44
    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 !

    J'ai quelques erreurs à la compilation de ce code :

    Code :

    error C2065: 'round' : undeclared identifier

    J'ai cherché mais je n'ai pas trouvé de librairie contenant cette fonction
    C'est la librairie math.

    C:\Documents and Settings\Alex\Bureau\OpenGl et SDL_ttf\Ctext.cpp(30) : error C2678: binary '!=' : no operator defined which takes a left-hand operand of type 'class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >'
    (or there is no acceptable conversion)
    C:\Documents and Settings\Alex\Bureau\OpenGl et SDL_ttf\Ctext.cpp(31) : error C2678: binary '!=' : no operator defined which takes a left-hand operand of type 'class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >'
    (or there is no acceptable conversion)
    C:\Documents and Settings\Alex\Bureau\OpenGl et SDL_ttf\Ctext.cpp(37) : error C2678: binary '!=' : no operator defined which takes a left-hand operand of type 'class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >'
    (or there is no acceptable conversion)
    La il faut faire aussi un include :

    @+

  5. #45
    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
    Pour les strings c'est résolu, mais pour la librairie math elle est bien incluse mais pas de fonction round connue. Peut-etre la librairie n'est pas à jour, j'ai VC++6.

  6. #46
    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
    Bon, je suis repassé sous Dev-Cpp et la plus de problème, sa compile parfaitement (merci Bilou).
    Le code fonctionne à merveille, je te remercie beaucoup fearyourself, je vais l'étudier et je vais enfin pouvoir avancer dans mon projet.

  7. #47
    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 !

    Peut-être peux-tu passer à à la dernière version de Visual Studio, il en existe une gratuite.

    N'oublie pas de marquer le message comme résolu.

    Cordialement,
    razmott

  8. #48
    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 déja essayé de passer à visual C++ express, mais c'est une usine à gaz à installer, les headers sont situés dans le SDK qu'il faut telecharger séparément, et dont il existe plusieurs versions avec dans la dernières des fichiers manquants. Donc après avoir essayé pendant pas mal d'heures j'ai décidé d'abandonner cette solution. Vais repasser sous Code Block ou Devcpp.

+ Répondre à la discussion
Cette discussion est résolue.
Page 3 sur 3 PremièrePremière 123

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, 19h05
  2. Réponses: 1
    Dernier message: 06/06/2010, 10h53
  3. Probleme d'affichage image OpenGL
    Par nonolerobot77 dans le forum GLUT
    Réponses: 2
    Dernier message: 22/02/2008, 11h54
  4. Traitement image OpenGL
    Par LEK dans le forum OpenGL
    Réponses: 2
    Dernier message: 02/11/2006, 08h28

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