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 :

Carré blanc avec texture et transparence


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2020
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2020
    Messages : 5
    Par défaut Carré blanc avec texture et transparence
    Bonjour à tous !

    Je viens vers vous car j'ai un petit problème concernant mon projet de jeu en openGL.
    Mon groupe de projet code sous code::blocks, donc j'ai du me mettre sous code::blocks, sous windows et quitter atom sous Linux.
    J'ai un programme, qui fonctionne sous Linux et affiche correctement ma texture avec la transparence sur le quad. Quand je copie ce code sous code::blocks, ma texture apparaît très brièvement, c'est furtif, puis disparaît, et affiche un carrée blanc. Je suis sur ce problème depuis deux semaines, j'ai épluché de nombreux forum, certain parle de problème de suppression de texture, de pointeur, de texture mal charger mais rien n'y fait.

    Une chose est a savoir, ma texture fonctionne qi je sors mon code de dessin de la boucle loop.


    Je vous joins le code, qui est plutôt dense et moche, je vous rassure c'est pour le débogage, je mettrais tout dans des fonctions et des autres fichiers après.

    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
    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
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
     
    #include <SDL/SDL.h>
    #include <SDL/SDL_image.h>
    #include <GL/gl.h>
    #include <GL/glu.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <math.h>
    #include <Plateau.h>
     
    /* Dimensions initiales et titre de la fenetre */
    static const unsigned int WINDOW_WIDTH = 800;
    static const unsigned int WINDOW_HEIGHT = 600;
    static const char WINDOW_TITLE[] = "TD04 Minimal";
     
    static float aspectRatio;
     
    /* Espace fenetre virtuelle */
    static const float GL_VIEW_SIZE = 150.;
     
    /* Nombre de bits par pixel de la fenetre */
    static const unsigned int BIT_PER_PIXEL = 32;
     
    /* Nombre minimal de millisecondes separant le rendu de deux images */
    static const Uint32 FRAMERATE_MILLISECONDS = 1000 / 60;
     
    SDL_Surface* ChargerImg(const char* filename){
      return(IMG_Load(filename));
    }
     
    void LibererImg(SDL_Surface* surface){
      SDL_FreeSurface(surface);
    }
     
     
    void reshape(SDL_Surface** surface, unsigned int width, unsigned int height)
    {
        SDL_Surface* surface_temp = SDL_SetVideoMode(
            width, height, BIT_PER_PIXEL,
            SDL_OPENGL | SDL_GL_DOUBLEBUFFER | SDL_RESIZABLE);
        if(NULL == surface_temp)
        {
            fprintf(
                stderr,
                "Erreur lors du redimensionnement de la fenetre.\n");
            exit(EXIT_FAILURE);
        }
        *surface = surface_temp;
     
        aspectRatio = width / (float) height;
     
        glViewport(0, 0, (*surface)->w, (*surface)->h);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        if( aspectRatio > 1)
        {
            gluOrtho2D(
            -GL_VIEW_SIZE / 2. * aspectRatio, GL_VIEW_SIZE / 2. * aspectRatio,
            -GL_VIEW_SIZE / 2., GL_VIEW_SIZE / 2.);
        }
        else
        {
            gluOrtho2D(
            -GL_VIEW_SIZE / 2., GL_VIEW_SIZE / 2.,
            -GL_VIEW_SIZE / 2. / aspectRatio, GL_VIEW_SIZE / 2. / aspectRatio);
        }
    }
     
     
    int main(int argc, char** argv)
    {
        /* Initialisation de la SDL */
        if(-1 == SDL_Init(SDL_INIT_VIDEO))
        {
            fprintf(
                stderr,
                "Impossible d'initialiser la SDL. Fin du programme.\n");
            exit(EXIT_FAILURE);
        }
     
        /* Ouverture d'une fenetre et creation d'un contexte OpenGL */
        SDL_Surface* surface;
        reshape(&surface, WINDOW_WIDTH, WINDOW_HEIGHT);
     
        /* Initialisation du titre de la fenetre */
    	   SDL_WM_SetCaption(WINDOW_TITLE, NULL);
     
        /*Charger une image*/
        SDL_Surface* Logo = ChargerImg("img/unite/V1_R_B.png");
     
        if( Logo == NULL){
          fprintf(
              stderr,
              "Le pointeur est NULL. Erreur. \n");
          exit(EXIT_FAILURE);
        }
     
        /* Allouer la memoire texture*/
        GLuint textures;
        glGenTextures(1, &textures);
        glBindTexture(GL_TEXTURE_2D, textures);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
     
        /* Copie sur la carte graphique */
        glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,Logo->w,Logo->h,0,GL_RGBA,GL_UNSIGNED_BYTE,Logo->pixels);
        glBindTexture(GL_TEXTURE_2D, 0);
     
     
     
        /* Boucle principale */
        int loop = 1;
        while(loop)
        {
            /* Recuperation du temps au debut de la boucle */
            Uint32 startTime = SDL_GetTicks();
     
            /* Placer ici le code de dessin */
            glClear(GL_COLOR_BUFFER_BIT);
            glMatrixMode(GL_MODELVIEW);
            glLoadIdentity();
     
            glEnable(GL_TEXTURE_2D);
            glBindTexture(GL_TEXTURE_2D, textures);
     
            glPushMatrix();
            glEnable(GL_BLEND);
        	glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
     
            glBegin(GL_QUADS);
     
            glTexCoord2f(0,1);
            glVertex2f( 0.0 , 0.0);
     
            glTexCoord2f(1,1);
            glVertex2f( 50.0 , 0.0);
     
            glTexCoord2f(1,0);
            glVertex2f( 50.0 , 50.0);
     
            glTexCoord2f(0,0);
            glVertex2f( 0.0 , 50.0);
     
            glEnd();
     
            glDisable(GL_BLEND);
            glPopMatrix();
     
            glBindTexture(GL_TEXTURE_2D, 0);
            glDisable(GL_TEXTURE_2D);
     
            /* Echange du front et du back buffer : mise a jour de la fenetre */
            SDL_GL_SwapBuffers();
     
     
     
            /* Boucle traitant les evenements */
            SDL_Event e;
            while(SDL_PollEvent(&e))
            {
                /* L'utilisateur ferme la fenetre : */
    			if(e.type == SDL_QUIT)
    			{
    				loop = 0;
    				break;
    			}
     
    			if(	e.type == SDL_KEYDOWN
    				&& (e.key.keysym.sym == SDLK_q || e.key.keysym.sym == SDLK_ESCAPE))
    			{
    				loop = 0;
    				break;
    			}
     
                /* Quelques exemples de traitement d'evenements : */
                switch(e.type)
                {
                    /* Redimensionnement fenetre */
    				case SDL_VIDEORESIZE:
                        reshape(&surface, e.resize.w, e.resize.h);
                        break;
     
                    /* Clic souris */
                    case SDL_MOUSEBUTTONUP:
                        printf("clic en (%d, %d)\n", e.button.x, e.button.y);
                        break;
     
                    /* Touche clavier */
                    case SDL_KEYDOWN:
                        printf("touche pressee (code = %d)\n", e.key.keysym.sym);
                        break;
     
                    default:
                        break;
                }
            }
     
            /* Calcul du temps ecoule */
            Uint32 elapsedTime = SDL_GetTicks() - startTime;
            /* Si trop peu de temps s'est ecoule, on met en pause le programme */
            if(elapsedTime < FRAMERATE_MILLISECONDS)
            {
                SDL_Delay(FRAMERATE_MILLISECONDS - elapsedTime);
            }
        }
        glDeleteTextures(1, &textures);
        SDL_FreeSurface(Logo);
        /* Liberation des ressources associees a la SDL */
        SDL_Quit();
     
        return EXIT_SUCCESS;
    }
    J'espère que l'on trouveras une solution et je vous remercie d'avance pour le temps que vous m'accorderez.

  2. #2
    Expert confirmé
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 226
    Par défaut
    Le code est effectivement pas terrible, mais aussi c'est de l'OpenGL 1 une raison à cela ?
    Non parce que là tu dois virer glu et les glbegin/glend/glLoadIdentity/glPushMatrix/glPopMatrix/glVertex2f/glTexCoord2f/gluOrtho2D etc etc
    Ce sont des fonctions déprécier ,et même sur GL1 on peut s'en passé (on utilisant glLoadMatrix et les VA tout simplement).

    Sinon ça sert à rien de faire a chaque tour de boucle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    glEnable(GL_TEXTURE_2D);
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
     
    glDisable(GL_BLEND);
    glBindTexture(GL_TEXTURE_2D, 0);
    glDisable(GL_TEXTURE_2D);
    tu fait ça u_ne fois pour l'initialisation et ça suffira (et peut etre que ça marcherai mieux):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    glEnable(GL_TEXTURE_2D);
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);

  3. #3
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2020
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2020
    Messages : 5
    Par défaut
    Tout d'abord, merci pour ta réponse.

    On doit utiliser l'openGL1 dans le sujet. Et avec le confinement on a fait que très peu de cours, j'ai donc repris le code de correction du professeur.

    Je vais essayer de voir ce que fais glLoadMatrix que je ne connais pas du tout. Et quand tu dis les VA, qu'entends tu exactement par là ?

    J'ai mis l'initialisation en dehors de la boucle, mais cela ne change rien.
    Le problème ne pourrait-il pas venir de la gestion de la mémoire sous windows ? Puisque l'image s'affiche puis disparait, alors que cela ne le fait pas sous Linux ?

  4. #4
    Expert confirmé

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 035
    Billets dans le blog
    12
    Par défaut
    C'est quoi l'école où tu es, qui te demande de faire de l'OpenGL 1 (c'est pas que c'est déprécié depuis... 16 ans, mais bon) ?

    Sinon, pour ton problème de texture, il te manque un appel à `glActiveTexture`, qui dit à OpenGL sur quelle unité de texture il doit appliquer le bind de ta texture :
    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
     
        while(loop)
        {
            /* Recuperation du temps au debut de la boucle */
            Uint32 startTime = SDL_GetTicks();
     
            /* Placer ici le code de dessin */
            glClear(GL_COLOR_BUFFER_BIT);
            glMatrixMode(GL_MODELVIEW);
            glLoadIdentity();
     
            glEnable(GL_TEXTURE_2D);
            glactivetexture(GL_TEXTURE0); // <- Ici, avant de bind ta texture (uniquement nécessaire pour l'utiliser dans un rendu)
            glBindTexture(GL_TEXTURE_2D, textures);
     
            // ...
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  5. #5
    Expert confirmé
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 226
    Par défaut
    Citation Envoyé par Chuchu62 Voir le message
    Je vais essayer de voir ce que fais glLoadMatrix que je ne connais pas du tout.
    Cela permet de virer la plupart des fonction obsolète sur GL1 et 2 , par contre tu dois du coup gerer les matrice toi meme (mais au moins tu saura comment ça marche).

    Citation Envoyé par Chuchu62 Voir le message
    Et quand tu dis les VA, qu'entends tu exactement par là ?
    VA pour Vertex Array.
    C'est plus propre que glbegin/glend

  6. #6
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2020
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2020
    Messages : 5
    Par défaut
    Merci à tous pour vos réponses !

    J'ai fais un appel à glActiveTexture, après avoir installer glext, cependant toujours le même problème. L'image est affichée brièvement et disparait.
    En ce qui concerte le glLoadMatrix, je veux bien me renseigner un peu plus, mais comme le sujet est demandé en OpenGL1, et que tout ce que l'on a appris seras remplacé par glLoadMatrix, je suis pas sûr que ce soit apprécié.

    J'avoue que la je désespère, je suis chargé de faire tout l'openGL toute seule, et rien n'avance ...

    D'autres idées ?

  7. #7
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 157
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 157
    Billets dans le blog
    152
    Par défaut
    En termes de tutoriels, la référence pour du OpenGL 1 était les tutoriels de Nehe. j'ai un honte de ressortir ça de la cave ...
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

Discussions similaires

  1. Réponses: 3
    Dernier message: 04/04/2007, 11h25
  2. Réponses: 2
    Dernier message: 17/02/2007, 05h43
  3. Chargement de fichiers .x avec texture
    Par Omfraax dans le forum OpenGL
    Réponses: 3
    Dernier message: 17/01/2007, 09h42
  4. Réponses: 1
    Dernier message: 25/09/2006, 11h44
  5. BP avec Textures en OpenGL
    Par skyghis dans le forum OpenGL
    Réponses: 11
    Dernier message: 27/11/2003, 17h15

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