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 :

Portage de SDL vers OpenGL


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Avatar de TheDrev
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    310
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 310
    Par défaut Portage de SDL vers OpenGL
    Bonjour !

    Je suis en train d'apprendre OpenGL et j'essaye de porter un programme depuis SDL. Il s'agit d'un bête tile engine, je pourrai alors remplacer les tiles par des cubes pour faire quelques beau effets...

    Les difficultés que j'ai en ce moment viennent des trop nombreux choix qui s'offre pour re implémenter ce moteur avec OpenGL, n'ayant pas le recule nécessaire pour apprécier si telle ou telle solution sera efficace ou peu maintenable dans le future.

    Je remplace logiquement mes tiles (SDL_Surface, seul ou dans une structure tile) par un carré (vertex avec GL_QUADS)

    - En y reflechissant, il serai aussi possible d'utiliser GL_QUAD_STRIP ?
    - Au niveau du positionnement des carrées (actuellement j'utilise GL_QUADS)
    j'ai d'abord simplement multiplié chaque coord par la position du tile.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void square_draw(int x, int y)
    {  
                glBegin(GL_QUADS);
                glVertex2i(x * TILE_SIZE + TILE_SIZE, y * TILE_SIZE + TILE_SIZE);   // Bottom left
                glVertex2i(x * TILE_SIZE, y * TILE_SIZE + TILE_SIZE);               // Botton right
                glVertex2i(x * TILE_SIZE, y * TILE_SIZE);                           // Top right
                glVertex2i(x * TILE_SIZE + TILE_SIZE, y * TILE_SIZE);               // Top left
                glEnd();
     
    }
    Mais j'ai par la suite pensé après avoir commencé a lire le guide que je pourrai utiliser des translations comme ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    void square_draw(int x, int y)
    {
        glPushMatrix();
        glTranslated(x * TILE_SIZE - 32, 480 - y * TILE_SIZE - 64, 0);
     
        glBegin(GL_QUADS);
             glVertex2i(TILE_SIZE + TILE_SIZE, TILE_SIZE + TILE_SIZE);   // Bottom left
             glVertex2i(TILE_SIZE, TILE_SIZE + TILE_SIZE);               // Botton right
             glVertex2i(TILE_SIZE, TILE_SIZE);                           // Top right
             glVertex2i(TILE_SIZE + TILE_SIZE, TILE_SIZE);               // Top left
        glEnd();
     
        glPopMatrix();
    }
    Que penser de ces solutions (les deux marchent) ?

    A noter que le 480 de la ligne glTranslated(x * TILE_SIZE - 32, 480 - y * TILE_SIZE - 64, 0); est la taille de la fenêtre, car avec SDL l'origine des x se trouve "en haut a gauche" et avec OpenGL "en bas a gauche". La aussi, comment ce changement doit il être traite de cette façon ?


    Voici pour finir le code appellant cette fonction

    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
     
    bool map_draw(map *p_map)
    {
        int x, y;
     
        glLoadIdentity();
        glOrtho(0.0f, 480, 0, 480, -100.0f, 100.0f);
     
        for (y=0;y<p_map->height;y++)
        {
            for (x=0;x<p_map->width[y];x++)
            {
                if (p_map->pp_tile[y][x].key == '_')
                {
                    glColor3f(1, 1, 0);
                }
                else if (p_map->pp_tile[y][x].key == '#')
                {
                    glColor3f(1, 0, 0);
                }
     
                square_draw(x, y);
            }
        }
     
        return true;
    }

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Mars 2005
    Messages : 249
    Par défaut
    Pour tes deux méthodes d'affichage, la seconde présente un avantage certain : si un jour tu décides de passer aux VBO (vertex buffer, qui permet d'améliorer les performances d'affichage), tu auras moins de choses à changer et tu pourras n'avoir qu'un quad en mémoire vidéo que tu afficheras en plusieurs exemplaires avec une translation associée. En attendant, en l'absence de VBO, les deux méthodes sont valables mais la 2de me parait plus agréable

    Concernant l'origine de ton repère, il n'y a rien d'obligatoire dans opengl : c'est toi qui définis le repère lorsque tu initialises la matrice de projection (ton appel à glOrtho(0.0f, 480, 0, 480, -100.0f, 100.0f); ) Tu peux très bien changer ces valeurs pour inverser l'axe des x, pour mettre l'origine au centre, etc. bref tu es libre

  3. #3
    Membre très actif
    Avatar de TheDrev
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    310
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 310
    Par défaut
    ok, perfect !

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

Discussions similaires

  1. portage de SCO vers Linux
    Par jeje99 dans le forum Informix
    Réponses: 1
    Dernier message: 27/05/2006, 12h40
  2. [ Info ] Portage appli C++ vers Plugin Eclipse
    Par fredmel dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 01/10/2005, 14h33
  3. Portage requete Access vers SQL Server (Iif)...
    Par cmousset dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 14/06/2005, 16h38
  4. [Kylix] Portage d'application Delphi vers Kylix
    Par BONNEFOI Patrick dans le forum EDI
    Réponses: 4
    Dernier message: 03/05/2005, 22h35
  5. [SDL et OpenGL]Vitesse d'initalisation ....
    Par RegBas dans le forum OpenGL
    Réponses: 2
    Dernier message: 24/02/2005, 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