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

Développement 2D, 3D et Jeux Discussion :

[SDL] Problème de vitesse


Sujet :

Développement 2D, 3D et Jeux

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 80
    Points : 30
    Points
    30
    Par défaut [SDL] Problème de vitesse
    Bonjour, bonsoir à tous (et bonne année ).

    Je me présente, Hybrix.
    Depuis quelques temps (depuis aout avec de grandes pauses), je suis sur un jeu en 2D reprenant le thème des Super Smash Bros (jeux de combats de Nintendo).

    Voici un bref récapitulatif du jeu :

    Le jeu s'appelle Smash 2D, il est codé en C et utilise les librairies SDL et FMOD.
    Le but du jeu est pour le moment de parcourir les niveaux en faisant le plus gros score possible.

    Le jeu utilise le scrolling (défilement du niveau).
    Afin de ne pas afficher le décors blocs par blocs, j'ai crée une surface HWSURFACE de la taille de la map souhaiter (6 fois la largeur de l'écran environ) dans laquelle je blit tout les éléments du décors.
    Apres avoir fait ça je fait apparaitre, le temps en haut, les vies les dégats, ... et le joueur.
    (Plus les monstres par la suite).

    Voici quelques screenshots pour vous donnez une idée du jeu :

    Screen 1
    Screen 2


    Le problème

    Depuis maintenant 1 mois et demi, j'ai commencé la création des nouveaux menus, et j'ai décidé de passer le jeu en 1024*768(autrefois 800*600).

    C'est la que tout à commencer, j'ai remarqué que le jeu ramais .
    Affolé, j'ai posté sur le site , on m'a conseillé de regarder le taux de FPS, ce qui m'a donné 22 .

    Pris par la panique (j'exagère un peu la ), j'ai testé une boucle simple m'affichant seulement un fond blanc et la ... 30 FPS seulement.
    D'après les membres du site , cela vient de mon ordinateur (Duron 1,8 Ghz, 768Mo de ram, ati 9200se), ce qui est bizarre vus que je fait tourner des plus gros jeux sans ramer.

    Je me suis donc permis de venir demander votre aide (deux gros sites réunis ça doit savoir non ?).

    Merci à vous.
    Hybrix

  2. #2
    Expert confirmé
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 524
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 524
    Points : 5 184
    Points
    5 184
    Par défaut
    des plus gros jeux en 2D ?
    utilisant la SDL uniquement ?
    j'en doute

    il faudrait que tu passes ton jeux sur directx ou opengl pour profiter des capacités hardware de la carte graphique pour améliorer ton frame rate
    c'est la seule solution que je vois en dehors d'optimiser à mort toutes les fonctions appelées plusieurs fois par image (avec de grandes chances d'obtenir peu de gain au final)
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 80
    Points : 30
    Points
    30
    Par défaut
    Non non, des plus gros jeux en 3D .

    Si je passe sous L'openGL, je devrait tout refaire ???
    Ou seulement adapter le code ? (sachant que je reste dans la 2D)

  4. #4
    Expert confirmé
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 524
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 524
    Points : 5 184
    Points
    5 184
    Par défaut
    tu n'as "que" le code de la partie graphique à adapter
    en gros, tout ce qui fait appel à la SDL pour afficher quelque chose à l'écran devra passer par opengl

    le mieux serait peut-etre que tu te fasses la main sur quelques bouts de code avant
    genre afficher des sprites à l'écran, des trucs dans le genre
    à la limite, si tu veux te convaincre de l'utilité de le faire, testes un affichage d'un grand nombre de sprites avec la SDL et fais la ^meme chose avec opengl
    tu verras la différence d'images par seconde
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  5. #5
    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 : 43
    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
    Ce n'est pas normal d'avoir ce temps d'affichage avec ta configuration.

    Pourrait-on voir le code "vide" que tu as testé ?

    Jc

  6. #6
    Membre actif Avatar de ironzorg
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 288
    Points : 245
    Points
    245
    Par défaut
    Moi aussi lors du développement de mon jeu je suis passé de 640*480 à 1024*748 et TADAA !!!! Pareil que toi ... Je suis passé de 70 FPS à meme pas 25 :'(
    Je n'ai jamais résolu le problème au point de dépasser les 50 FPS malheureusement ( implémentation ddes blits , allègement du poids des images etc ... )

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 80
    Points : 30
    Points
    30
    Par défaut
    Voici le code :
    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
    #include <stdlib.h>
    #include <stdio.h>
    #include <SDL/SDL.h>
    #include <SDL/SDL_Image.h>
    #include <SDL/SDL_ttf.h>
    #include <SDL/SDL_getenv.h>
    #include <FMOD/fmod.h>
     
     
    int main(int argc, char *argv[])
    {
     
        /* ---------------------------- */
        /*             ECRAN            */
        /* ---------------------------- */
        SDL_Surface   *ecran = NULL;
        SDL_Init(SDL_INIT_VIDEO);
        SDL_WM_SetIcon(IMG_Load("icone.gif"), NULL);
        SDL_WM_SetCaption("Super Smash Bros 2D --- Par Hybrix", NULL);
        putenv("SDL_VIDEO_WINDOW_POS=center");
        ecran = SDL_SetVideoMode(LARGEUR_ECRAN, HAUTEUR_ECRAN, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
     
        /* ---------------------------- */
        /*          VARIABLES           */
        /* ---------------------------- */
        SDL_Event event;
        TTF_Font  *police = NULL;
        int  continuerAventure = 1;
        // Pour les sauts
        Uint32 tempsPrecedent, tempsActuel, tempsEcoule;
     
        //Init
        int tempsPrecedent2 = 0,nbImg = 0;
        char infoFPS[10];
     
        while(continuerAventure)
        {
     
            /* ------------------------------------ */
            /*     Recuperation du temps actuel     */
            /* ------------------------------------ */
            tempsActuel    = SDL_GetTicks();
            tempsEcoule    = tempsActuel - tempsPrecedent;
            tempsPrecedent = tempsActuel;
     
     
            // Affichage du nombre de FPS
            nbImg++;
     
            if (tempsActuel - tempsPrecedent2 > 1000)
            {
               sprintf(infoFPS,"Smash 2D - FPS : %ld",nbImg);
     
               SDL_WM_SetCaption(infoFPS, NULL);
               nbImg=0;
     
               tempsPrecedent2 = tempsActuel;
            }
            SDL_Flip(ecran);
        }
     
     
        SDL_Quit();
        return EXIT_SUCCESS;

  8. #8
    Expert confirmé
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 524
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 524
    Points : 5 184
    Points
    5 184
    Par défaut
    brièvement, si tu testes le même code utilisant opengl au lieu de sdl, tu devrais avoir un augmentation du fps

    je te laisse ton code que j'ai modifié rapido pour GL
    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
    #include <stdlib.h>
    #include <stdio.h>
    #include <SDL/SDL.h>
    // ajouter (2 includes)
    #include <gl/gl.h>
    #include <gl/glu.h>
     
    #define LARGEUR_ECRAN       1024
    #define HAUTEUR_ECRAN       768
    int main(int, char**)
    {
        /* ---------------------------- */
        /*             ECRAN            */
        /* ---------------------------- */
        SDL_Init(SDL_INIT_VIDEO);
        SDL_WM_SetCaption("Super Smash Bros 2D --- Par Hybrix", NULL);
        putenv("SDL_VIDEO_WINDOW_POS=center");
    // remplacer (1 ligne)
    //  SDL_Surface   *ecran = ecran = SDL_SetVideoMode(LARGEUR_ECRAN, HAUTEUR_ECRAN, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
    // par (2 lignes)
    SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
    SDL_SetVideoMode(LARGEUR_ECRAN, HAUTEUR_ECRAN, 32, SDL_OPENGL);
     
    // ajouter (6 lignes)
    glViewport(0, 0, LARGEUR_ECRAN, HAUTEUR_ECRAN);
    glMatrixMode(GL_PROJECTION_MATRIX);
    glLoadIdentity();
    glMatrixMode(GL_MODELVIEW_MATRIX);
    glLoadIdentity();
    glClearColor(0, 0, 1, 0);
        /* ---------------------------- */
        /*          VARIABLES           */
        /* ---------------------------- */
        SDL_Event event;
        int  continuerAventure = 1;
        // Pour les sauts
        Uint32 tempsPrecedent, tempsActuel, tempsEcoule;
     
        //Init
        int tempsPrecedent2 = 0,nbImg = 0;
    // ton tableau était trop petit, je l'ai passé de 10 à 100
        char infoFPS[100];
     
        while(continuerAventure)
        {
     
            /* ------------------------------------ */
            /*     Recuperation du temps actuel     */
            /* ------------------------------------ */
            tempsActuel    = SDL_GetTicks();
            tempsEcoule    = tempsActuel - tempsPrecedent;
            tempsPrecedent = tempsActuel;
     
     
            // Affichage du nombre de FPS
            nbImg++;
     
            if (tempsActuel - tempsPrecedent2 > 1000)
            {
               sprintf(infoFPS,"Smash 2D - FPS : %ld",nbImg);
     
               SDL_WM_SetCaption(infoFPS, NULL);
               nbImg=0;
     
               tempsPrecedent2 = tempsActuel;
            }
    // remplacer (1 ligne)
    //        SDL_Flip(ecran);
    // par (2 lignes)
    glClear(GL_COLOR_BUFFER_BIT);
    SDL_GL_SwapBuffers();
        }
     
     
        SDL_Quit();
        return EXIT_SUCCESS;
    }
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 80
    Points : 30
    Points
    30
    Par défaut
    Ah merci c'est beaucoup mieux, plus de 180fps !!!

    Par contre si je veut afficher des sprites et tout le reste je suis obliger d'apprendre la librairie OpenGL ???

  10. #10
    Rédacteur
    Avatar de bafman
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    2 574
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2003
    Messages : 2 574
    Points : 5 323
    Points
    5 323
    Par défaut
    Citation Envoyé par shenron666
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    glClear(GL_COLOR_BUFFER_BIT);
    SDL_GL_SwapBuffers();
    tu clear souvent tes buffer avant de les swapper ?
    la, forcement, ca donnera toujours un bel ecran bleu

    sinon, pour repondre a la question de Hybrix : oui, il faudra apprendre à afficher des quads texturé en openGL, mais c'est sans doute le truc le plus facile à faire en OpenGL
    * Il est infiniment plus simple de faire rapidement un code qui marche que de faire un code rapide qui marche
    * pour faciliter les recherches, n'oubliez pas de voter pour les réponses pertinentes
    Mes articles

  11. #11
    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 : 43
    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 bafman
    tu clear souvent tes buffer avant de les swapper ?
    la, forcement, ca donnera toujours un bel ecran bleu

    sinon, pour repondre a la question de Hybrix : oui, il faudra apprendre à afficher des quads texturé en openGL, mais c'est sans doute le truc le plus facile à faire en OpenGL
    Je montre comment faire dans les tutoriels sur le pong :

    http://fearyourself.developpez.com/tutoriel/sdl/pong/

    Jc

  12. #12
    Expert confirmé
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 524
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 524
    Points : 5 184
    Points
    5 184
    Par défaut
    Citation Envoyé par Hybrix
    Ah merci c'est beaucoup mieux, plus de 180fps !!!

    Par contre si je veut afficher des sprites et tout le reste je suis obliger d'apprendre la librairie OpenGL ???
    cool (et logique) que ce soit mieux
    concernant opengl, c'est une bibliothèque graphique 3D, tu connais le dicton "qui peut le plus peu le moins", rien ne t'empêche de faire de la 2D avec opengl bien au contraire puisque tu utiliseras les capacités d'accélération graphiques de ta carte video

    Citation Envoyé par bafman
    tu clear souvent tes buffer avant de les swapper ?
    la, forcement, ca donnera toujours un bel ecran bleu
    oui je clear mes buffers parceque si je ne le fait pas je ne sais pas ce qu'ils contiennent et ça fait mal aux yeux pleins de pixels de couleur différentes (fais un test et prépare l'aspirine )
    et donc le bel écran bleu, c'était le but
    juste une fenêtre de base à l'arrache pour que Hybrix voit la différence avec une "simple" fenêtre SDL
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 80
    Points : 30
    Points
    30
    Par défaut
    Merci à vous pour vos réponses,
    J'ai appris quelques trucs en OpenGL, mais je ne voit toujours pas comment comment afficher des sprites, j'arrive à afficher des surfaces avec GL_QUADS, GL_TRIANGLES, ... .
    j'imagine qu'il faut "blitter" les surfaces dessus non ?

  14. #14
    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 : 43
    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 Hybrix
    Merci à vous pour vos réponses,
    J'ai appris quelques trucs en OpenGL, mais je ne voit toujours pas comment comment afficher des sprites, j'arrive à afficher des surfaces avec GL_QUADS, GL_TRIANGLES, ... .
    As-tu regardé ceci :
    http://fearyourself.developpez.com/t...2-base-moteur/

    ?

    j'imagine qu'il faut "blitter" les surfaces dessus non ?
    On ne fera plus de blit puisque c'est opengl qui va tout faire

    Jc

  15. #15
    Expert confirmé
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 524
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 524
    Points : 5 184
    Points
    5 184
    Par défaut
    en gros, tes sprites seront des GL_QUADS texturés

    par exemple, tu crées une SDL_Surface contenant tout tes sprites, enfin ça dépend combien tu en a, plusieurs surfaces si tu préfères, et tu transfères tes surfaces comme textures utilisées pour les GL_QUADS
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  16. #16
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 80
    Points : 30
    Points
    30
    Par défaut
    Arf c'est pas évident tout ça !

    Je n'arrive pas à comprendre car avec la SDL, il suffisait de faire :

    SDl_Surface *matexture = IMG_Load("matexture.gif");

    puis plus loin :

    SDL_BlitSurface(matexture, NULL, ecran, &positiontexture);

    Hors en OpenGl pour creer un carré il faut faire :
    glBegin(GL_QUADS);
    glVertex2d( 0, 0);
    glVertex2d( 0, 50);
    glVertex2d(50, 50);
    glVertex2d(50, 0);
    glEnds();
    Ce cube n'a pas de nom et est directement affiché, ce qui m'enbrouille, sur l'exemple du pong, fearyourself fait :
    glBindTexture(GL_TEXTURE_2D,txtballe);

    je ne voit a aucun moment comment on fait pour coller une texture sur le GL_QUADS (qui n'a pas de nom).

    Au final, je ne voit pas comment on s'y retrouve si on "colle" une texture chargé sur tel ou tel GL_QUADS (on ne les differencient pas, ils n'ont pas de noms )

    Je comprend plus rien (j'aimerais connaitre cela car je veut continuer mon jeu en 2D (la 3D ne m'interesse pas pour le moment)).

  17. #17
    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 : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Les polygones que tu rends vont automatiquement utiliser la texture actuellement active (spécifiée avec glBindTexture). Donc pour associer une texture à un quad, il suffit de l'activer juste avant de dessiner celui-ci. Ce qui peut se faire, pour plus de clarté, dans une même fonction de la structure qui va bien.

    Aussi, il ne faut pas oublier de spécifier les coordonnées de textures (un glTexCoord pour chaque glVertex).

  18. #18
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 80
    Points : 30
    Points
    30
    Par défaut
    Ah ! j'ai compris maintenant .

    J'ai créer un bout de code, mais la texture ne s'affiche pas .


    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
     
    #include <SDL/SDL.h>
    #include <SDL/SDL_Image.h>
    #include <SDL/SDL_getenv.h>
     
    #include <GL/gl.h>
    #include <GL/glu.h>
     
    #include "sdlglutils.h"
     
    #define LARGEUR_ECRAN 1024
    #define HAUTEUR_ECRAN  768
     
     
    int main(int argc, char *argv[])
    {
        // Variables
        SDL_Event event;
        bool continuer = true;
     
     
        // *** Initialisation de la fenêtre *** //
        SDL_Init(SDL_INIT_VIDEO);
        SDL_WM_SetCaption("Entrainement", NULL);
        SDL_SetVideoMode(LARGEUR_ECRAN, HAUTEUR_ECRAN, 32, SDL_OPENGL);
        putenv("SDL_VIDEO_WINDOW_POS=center");
        glMatrixMode( GL_PROJECTION );
        glLoadIdentity( );
        gluOrtho2D(0,LARGEUR_ECRAN,0,HAUTEUR_ECRAN);
        glEnable(GL_DEPTH_TEST);
        glEnable(GL_TEXTURE_2D);
     
        // création de la texture et chargement
        GLuint Fond = loadTexture("fond.jpg");
     
     
        while(continuer)
        {
        // ***   BOUCLE DES EVENEMENTS *** //
            while(SDL_PollEvent(&event))
            {
                switch(event.type)
                {
                    case SDL_QUIT:
                        continuer = false;
                        break;
                }
            }
        // ***         AFFICHAGE      *** // 
            glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
            glMatrixMode(GL_MODELVIEW);
     
            // j'appliquerais la texture Fond au prochain GL_QUADS
            glBindTexture(GL_TEXTURE_2D, Fond);
     
            // Je crée un GL Quads
            glBegin(GL_QUADS);
                glTexCoord2d(   0,   0);    glVertex2d(   0,   0);
                glTexCoord2d(   0,   1);    glVertex2d(   0, 100);
                glTexCoord2d(   1,   1);    glVertex2d( 100, 100);
                glTexCoord2d(   1,   0);    glVertex2d( 100,   0);
            glEnd();
     
            // Mise à jour de l'écran
            glFlush();
            SDL_GL_SwapBuffers();
        }
        return 0;
        SDL_Quit();
    }
     
     
    // Et la fonction loadtexture() : 
    SDL_Surface * flipSurface(SDL_Surface * surface);
     
    GLuint loadTexture(const char * filename,bool useMipMap)
    {
        GLuint glID;
        SDL_Surface * picture_surface = NULL;
        SDL_Surface *gl_surface = NULL;
        SDL_Surface * gl_fliped_surface = NULL;
        Uint32 rmask, gmask, bmask, amask;
     
        picture_surface = IMG_Load(filename);
        if (picture_surface == NULL)
            return 0;
     
    #if SDL_BYTEORDER == SDL_BIG_ENDIAN
     
        rmask = 0xff000000;
        gmask = 0x00ff0000;
        bmask = 0x0000ff00;
        amask = 0x000000ff;
    #else
     
        rmask = 0x000000ff;
        gmask = 0x0000ff00;
        bmask = 0x00ff0000;
        amask = 0xff000000;
    #endif
     
        SDL_PixelFormat format = *(picture_surface->format);
        format.BitsPerPixel = 32;
        format.BytesPerPixel = 4;
        format.Rmask = rmask;
        format.Gmask = gmask;
        format.Bmask = bmask;
        format.Amask = amask;
     
        gl_surface = SDL_ConvertSurface(picture_surface,&format,SDL_SWSURFACE);
     
        gl_fliped_surface = flipSurface(gl_surface);
     
        glGenTextures(1, &glID);
     
        glBindTexture(GL_TEXTURE_2D, glID);
     
     
        if (useMipMap)
        {
     
            gluBuild2DMipmaps(GL_TEXTURE_2D, 4, gl_fliped_surface->w,
                              gl_fliped_surface->h, GL_RGBA,GL_UNSIGNED_BYTE,
                              gl_fliped_surface->pixels);
     
            glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,
                            GL_LINEAR_MIPMAP_LINEAR);
     
        }
        else
        {
            glTexImage2D(GL_TEXTURE_2D, 0, 4, gl_fliped_surface->w,
                         gl_fliped_surface->h, 0, GL_RGBA,GL_UNSIGNED_BYTE,
                         gl_fliped_surface->pixels);
            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
        }
        glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
     
     
        SDL_FreeSurface(gl_fliped_surface);
        SDL_FreeSurface(gl_surface);
        SDL_FreeSurface(picture_surface);
     
        return glID;
    }
    La zone s'affiche met pas la texture ne s'applique pas

  19. #19
    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 : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Là comme ça, aucune idée. Première chose à faire : vérifie les éventuelles erreurs après chaque appel de fonction OpenGL.

  20. #20
    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 : 43
    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
    J'ai repris ton code, et en enlevant l'appel vers la fonction flippedSurface, le code tourne et la texture s'affiche.

    Montre ce bout de code,
    Jc

    PS: Il manque beaucoup de tests de retour des fonctions SDL...

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

Discussions similaires

  1. [Son] problème de vitesse
    Par glloq8 dans le forum Composants
    Réponses: 6
    Dernier message: 13/02/2006, 14h45
  2. [SDL] Problème avec SDL_Flip()
    Par Drannor dans le forum C
    Réponses: 6
    Dernier message: 24/11/2005, 22h26
  3. [debutant][c++] Problème de vitesse de déplacement
    Par bornibus dans le forum OpenGL
    Réponses: 15
    Dernier message: 26/02/2005, 09h16
  4. [SDL et OpenGL]Vitesse d'initalisation ....
    Par RegBas dans le forum OpenGL
    Réponses: 2
    Dernier message: 24/02/2005, 09h28
  5. [OpenGL] Problème de Vitesse d'éxécution
    Par stick059 dans le forum OpenGL
    Réponses: 9
    Dernier message: 19/11/2004, 13h57

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