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 :

Rendu offscreen tronqué


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de LapinGarou
    Homme Profil pro
    R&D Developer
    Inscrit en
    Octobre 2005
    Messages
    341
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : R&D Developer
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2005
    Messages : 341
    Par défaut Rendu offscreen tronqué
    Bonsoir à tous.

    Je travaille sur mon moteur 3D, sous Windows XP SP2 (si ça peut aider des fois...) et j'aimerai avoir une fonction qui calcule les ombres de mon heightmap(1024*1024) automatiquement au chargement d'un carte. La fonction est ok. Je stocke ce résultat dans un tableau 1d. Pour ce test, j'ai seulement pris les hauteurs pour déterminer les ombres, pour voir si déjà mon système de rendu offscreen est ok. Mais le problème est le suivant : quand je veux afficher ce tableau 1d, je suppose que je suis obligé de passer par un rendu offscreen, mais suivant la taille de la texture, il apparait des zones noires... :

    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
     
        int temp = 1024;//Map.GetWidth();
     
        OrthoMode(0, 0, temp, temp);
     
        lightmap = g_TexManage.GenerateTexture(temp, temp, GL_NEAREST, GL_NEAREST);
     
        glViewport(0,0,temp, temp);
        g_log.Write(LOG_PLAINTEXT, "temp = %i", temp);
        //glBindTexture(GL_TEXTURE_2D, lightmap);
     
        g_log.Write( LOG_PLAINTEXT , "Entering 'for' loop... width/height : %i", temp);
        glBegin(GL_POINTS);
            int j,i;
            for(j=0; j<temp; j++)    //scan en lignes
            {
                for (i=0; i<temp; i++)    //scan en colonnes
                {
                    // Set the textures customizable color
                    glColor3ub(Map.GetBrightnessAtPoint(i,j), Map.GetBrightnessAtPoint(i,j), Map.GetBrightnessAtPoint(i,j));
                    //glColor3ub(128, 128, 255);
                    //glColor3ub(Map.GetHeightAtPoint(j,i), Map.GetHeightAtPoint(j,i), Map.GetHeightAtPoint(j,i));
                    glVertex2f(i,j);
                }
            }
        glEnd();
     
        g_log.Write(LOG_PLAINTEXT, "i=%i j=%i", i, j);
     
        glBindTexture(GL_TEXTURE_2D, lightmap);
        glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 0, 0, temp, temp, 0);
        ///On rétablit la résolution d'affichage
        glViewport(0, 0, RESO_X, RESO_Y);
        PerspectiveMode();
    Hors, quand je divise par 2 pour le viewport et le copyteximage, j'obtient ceci (qui est ce que je devrais obtenir sans les divisions):

    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
     
        int temp = 1024;//Map.GetWidth();
     
        OrthoMode(0, 0, temp, temp);
     
        lightmap = g_TexManage.GenerateTexture(temp, temp, GL_NEAREST, GL_NEAREST);
     
        glViewport(0,0,temp/2, temp/2);
        g_log.Write(LOG_PLAINTEXT, "temp = %i", temp);
        //glBindTexture(GL_TEXTURE_2D, lightmap);
     
        g_log.Write( LOG_PLAINTEXT , "Entering 'for' loop... width/height : %i", temp);
        glBegin(GL_POINTS);
            int j,i;
            for(j=0; j<temp; j++)    //scan en lignes
            {
                for (i=0; i<temp; i++)    //scan en colonnes
                {
                    // Set the textures customizable color
                    glColor3ub(Map.GetBrightnessAtPoint(i,j), Map.GetBrightnessAtPoint(i,j), Map.GetBrightnessAtPoint(i,j));
                    //glColor3ub(128, 128, 255);
                    //glColor3ub(Map.GetHeightAtPoint(j,i), Map.GetHeightAtPoint(j,i), Map.GetHeightAtPoint(j,i));
                    glVertex2f(i,j);
                }
            }
        glEnd();
     
        g_log.Write(LOG_PLAINTEXT, "i=%i j=%i", i, j);
     
        glBindTexture(GL_TEXTURE_2D, lightmap);
        glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 0, 0, temp/2, temp/2, 0);
        ///On rétablit la résolution d'affichage
        glViewport(0, 0, RESO_X, RESO_Y);
        PerspectiveMode();
    D'où ma question : existe t-il une limite de taille ? Est-ce en rapport avec la résolution du bureau sous windows ? (je travaille sur un portable 1280*800)
    Je n'ai pas trouvé pour quelle taille de la texture (entre 512 et 1024 donc) je devrai obtenir le bon affichage, ça prendrait trop de temps je pense, même par dichotomie...

    Merci à ceux qui auront une piste, là je deviens chèvre .

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

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 577
    Par défaut
    je ne comprend pas ta question :
    existe t-il une limite de taille ?
    de quelle limite, de quelle taille parles tu ?

    par contre, tu dis que tu travailles en 1280*800, donc je ne comprend pas :
    int temp = 1024;

    glViewport(0,0,temp, temp);
    comment peux tu gérer un viewport de 1024 de haut si ta fenêtre fait 800 ?

    edit: c'est peut être ça ta question, une limite dans la taille du viewport ?
    si c'est ça alors oui, la limite est la taille de ta fenêtre
    auquel cas tu pourrais passer par les FBO pour contrer ce problème
    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
    Membre éclairé Avatar de LapinGarou
    Homme Profil pro
    R&D Developer
    Inscrit en
    Octobre 2005
    Messages
    341
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : R&D Developer
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2005
    Messages : 341
    Par défaut
    Ok. Mais comme c'est du offscreen, je ne vois pas où est le problème : si je voulais créer moi même une texture de 2048*2048 par une fractale par exemple, ça serait limité par la résolution maximale de mon écran ?
    Sinon, c'est quoi les FBO ?
    Entre autres, un truc bizarre :
    quand je remplace la taille 1024 par 512, j'ai ceci :

    C'est quoi le hic ? Quand j'utilise la texture qui se trouve dans le carré en bas à droite, ça marche, mais pas avec celle que je créée moi.

    EDIT> j'ai fini par comprendre : on ne peut pas créer un viewport plus grand que la fenetre dans laquelle on travaille. Mais ma question sur les FBO reste valable : c'est quoi ?

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

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 577
    Par défaut
    même si c'est du offscreen, tu as besoin d'un contexte qui va traiter tes pixels, ton contexte a forcément une surface limitée (définie lors de la création de la fenêtre) que tu ne peux dépasser, cette surface peut avoir une taille plus grande que ton écran (tu peux créer une fenêtre plus grande que la résolution de ton écran, pas obligé de l'afficher) si tu fais uniquement du offscreen mais si ton rendu offscreen est fait dans un même contexte que celui qui va servir à l'affichage tu es forcément limité

    je ne sais pas si je me fait bien comprendre, toute la base opengl passe par là

    et comme je te disais, si tu veux casser cette limite il n'y a (à ma connaissance) que les FBO (Frame Buffer Object)
    les FBO font partie d'une extension opengl servant à faire du render to texture avec leur propre framebuffer par exemple
    si tu fais quelques recherches sur le net (et dans les forums) tu trouveras toutes les infos nécessaires
    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
    Membre éclairé Avatar de LapinGarou
    Homme Profil pro
    R&D Developer
    Inscrit en
    Octobre 2005
    Messages
    341
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : R&D Developer
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2005
    Messages : 341
    Par défaut
    Merci, je vais chercher du côté des FBO, ça m'a l'air d'être plus dans ce goût là que je cherche à faire en fait : calcul de données, stockage dans un tableau, et s'en servir pour remplir une texture. J'étais pas parti sur la bonne piste là.

Discussions similaires

  1. Rendu offscreen & taille des textures
    Par zenux dans le forum OpenGL
    Réponses: 7
    Dernier message: 27/03/2011, 20h45
  2. Rendu Offscreen sans ReadPixels
    Par Burckel dans le forum OpenGL
    Réponses: 13
    Dernier message: 14/03/2007, 10h28
  3. Réponses: 2
    Dernier message: 05/07/2006, 12h09
  4. Changement de point de vue + Rendu Offscreen
    Par jimjim dans le forum OpenGL
    Réponses: 4
    Dernier message: 24/04/2006, 14h02
  5. p-buffer rendu offscreen
    Par chonos dans le forum OpenGL
    Réponses: 11
    Dernier message: 14/03/2006, 22h07

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