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 :

Envoyer rapidement pixels a FBO


Sujet :

OpenGL

  1. #1
    Membre émérite Avatar de onilink_
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    597
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 597
    Points : 2 439
    Points
    2 439
    Par défaut Envoyer rapidement pixels a FBO
    Bonjour,
    Je fais un moteur de lumière 2d qui fonctionne de cette façon:
    -j'ai un tableau data, qui contiens a la fois une lightmap et une collisionmap (4 octets de light suivis de 4 octets de collisions, a chaque fois, pour utiliser le cache au mieux)
    -je fais divers opérations assez coûteuses sur ce tableau, cela modifie la lightmap

    Une fois cela fait j'envoie la lightmap sur un FBO, et la collision map sur un autre FBO.
    Un shader me permet ensuite de faire d'autres traitements.

    Actuellement j'utilise la chose la plus horrible qui soit pour envoyer mes données, a coup de vertex (c'était juste pour voir si l'algo de lighting fonctionne):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    glBegin(GL_POINTS);
    for(int i=0; i<mapWid; ++i)
    for(int j=0; j<mapHei; ++j)
    {
        int c = t[ (i+j*mapWid)<<1 ];
        glColor3ub(c&0xFF, (c&0xFF00)>>8, (c&0xFF0000)>>16);
        glVertex2i(i, j);
    }
    glEnd();
    Sauf que maintenant, l'algo étant finis, j'aimerais bien connaître une solution efficace pour envoyer mes pixels a mes FBO.

    J'ai vu qu'il était toujours indiqué de passer par glTexImage2D, sauf que dans mon cas je me retrouve obligé a copier mes données de pixels
    dans un tableau affin de pouvoir lui passer, cette fonction ne donnant pas de paramètre 'step' (comme quand on utilise des VBO par exemple).

    C'était donc pour connaître le moyen le plus efficace dans mon cas en terme de performances.
    Merci d'avance, et bonne journée.
    Circuits intégrés mis à nu: https://twitter.com/TICS_Game

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


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

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 826
    Points : 218 288
    Points
    218 288
    Billets dans le blog
    117
    Par défaut
    Bonjour,

    Je dois dire, je n'ai pas trouvé de solution classe.
    Un moment, je pensais que vous pourriez passer par un fragment shader, afin de gérer les accès aux textures. Ainsi, en modifier la coordonnées de texture, vous tombiez sur l'un ou l'autre. Mais je trouve pas ça pratique ou très plausible.
    Vous pouvez par contre, essayez de faire passer vos données sur 32 bits. Les 16 premiers (les composantes r et b) seront pour votre lightmap, et les 16 autres, pour votre collision map. Mais bon, je doute que vous vouliez une telle chose pour une lightmap. Dans le même genre d'idée, si votre carte graphique supporte des textures sur 64 bits (je suis même pas sur que cela existe, ça doit pas j'ai l'impression), vous auriez pu faire la même chose.
    Maintenant, la seule solution que je vois, c'est de changer la représentation de votre tableau, du coté CPU (j'ai aussi du mal à comprendre pourquoi vous avez interlacé les deux).

    J'ai cherché à voir s'il y avait une sorte de glMapBuffer() pour les textures, mais ça ne doit pas exister.
    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.

  3. #3
    Membre émérite Avatar de onilink_
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    597
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 597
    Points : 2 439
    Points
    2 439
    Par défaut
    Bonjour,

    Hélas je ne peut changer la représentation de la lightmap, j'y avais aussi pensé.
    Pour ce qui est de l’intérêt des tableaux intercalés c'est simple: exploiter la mémoire cache.
    J'ai déjà testé avec et sans, et disons que les résultats sont vraiment très différents (je fait pas mal de boucles du genre scanline dessus en fait).
    En fait, en recopiant le tableau après les calculs, je continue d'avoir de loin des meilleurs perfs que s'ils étaient séparés.
    Du coup, actuellement je fait ça et un glDrawPixels, en attendant de modifier certaines choses pour directement utiliser glTexImage qui est plus rapide, et pas déprécié dans les nouvelles versions d'openGL.

    Merci d'avoir pris de votre temps pour répondre en tout cas.
    Si je trouve une meilleur solution entre temps je mettrait a jour le sujet.
    Circuits intégrés mis à nu: https://twitter.com/TICS_Game

Discussions similaires

  1. Peut on accèder plus rapidement à un pixel ?
    Par ArnaudFu13 dans le forum Images
    Réponses: 3
    Dernier message: 28/11/2012, 18h04
  2. manipuler des pixels rapidement, sans dx/ogl
    Par chuckey dans le forum Débuter
    Réponses: 8
    Dernier message: 11/02/2009, 11h32
  3. Accès rapide aux pixels en Python
    Par avironman dans le forum OpenCV
    Réponses: 4
    Dernier message: 26/08/2008, 18h03
  4. Réponses: 23
    Dernier message: 23/03/2006, 21h09
  5. Réponses: 2
    Dernier message: 30/05/2002, 11h19

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