Problème avec glReadPixels

Résolu
cs_Turok Messages postés 78 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 3 décembre 2011 - 19 août 2006 à 22:20
cs_Turok Messages postés 78 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 3 décembre 2011 - 22 août 2006 à 10:45
Je débute actuellement avec OpenGL et j'essaye de faire un jeux de serpend. Pour la collision avec les éléments du décord je veux utiliser glReadPixels, et lorsque il y a collision la fonction return 1 et le programme se quitte. Problème dés que je lance le programme, il quitte comme s'il y avait une collision mais je ne comprend pas pourquoi.
Voici la fonction :

bool moveNibble(deque<float> &Nibble, int direction)
{
    deque<float>::iterator it;
    it=Nibble.begin();
    
    float X=0.0f,Y=0.0f;
    
    switch(direction)
    {
         case 1 :           X 0.0f; Y +0.04f;
           break;
     
         case 2 :           X 0.0f; Y -0.04f;
           break;
     
         case 3 :           X -0.04f; Y 0.0f;
           break;
     
         case 4 :           X +0.04f; Y 0.0f;
           break;
    }

    if(X != 0.0f || Y != 0.0f)
    {
        GLubyte tab[1][1][1];
        glReadPixels(*it + X, *(it+1) + Y, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, tab);
        if (tab[0][0][0] != 0){return 1;}
    }

    Nibble.pop_back();
    Nibble.pop_back();
    Nibble.push_front(*(it+1) + Y);    
    Nibble.push_front(*it + X);

    return 0;

}

Turok

4 réponses

luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
22 août 2006 à 00:46
L'idéal c'est un processeur qui tourne à 0% ou presque. Si ton proc
tourne a 100% c'est que ton programme est mal fais et les perfs seront
pourris. Mais dans ton cas, le simple fait d'avoir la synchro vertical
de windows, suffit pour limiter la charge cpu, puisque le taux de
rafraichissement est bridé.


Sinon une carte video n'est pas faite pour fournir l'état des pixels,
donc ces fonctions sont TRES lentes. Une gestion de collisions se fait
sur un processeur. Car pdt que ton proc bosse, la carte video bosse
également (si ton prog est correct). Et de plus, je doute qu'un seul
pixel soit nécessaire pour la collision.
3
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
21 août 2006 à 09:26
Utiliser glReadPixels est très mauvais pour les performances. Et pour
la gestion des collisions, je pense pas que ce soit une très bonne
chose. Sinon méfie toi des comparaisons d'égalité de floatant:

"if (tab[0][0][0] > 0.001f)"
0
cs_Turok Messages postés 78 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 3 décembre 2011
21 août 2006 à 12:53
Lorsque je fais "if (tab[0][0][0] > 0.001f)" il ne détecte rien.
Lorsque je fais "if (tab[0][0][0] > 0.0f)" il détecte une sortie d'écran, mais pas sa queue, je ne comprend pas.

Et sinon pour en revenir aux performances, pense-tu que se soit moins rapide de tester un seul pixel par frame pour détecter une collision ou de comparer les coordonnées de tous les objets de l'écran?

Encore une question pi je t'embête plus, j'ai remarqué qu'avec OpenGL même si je ne met pas de delay le processeur  ne travaille pas à fond contrairement  à quand j'utilisait SDL pour l'affichage.  Est-ce c'est par rapport à la carte graphique?

Turok
0
cs_Turok Messages postés 78 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 3 décembre 2011
22 août 2006 à 10:45
Ok je te remercie. De toute facon puisque ça ne marche pas je suis forcé de comparer les coordonnées de chaque objet.

Turok
0
Rejoignez-nous