Problème avec glReadPixels [Résolu]

Messages postés
78
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
3 décembre 2011
- - Dernière réponse : 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
Afficher la suite 

4 réponses

Meilleure réponse
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
3
Merci
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.

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 137 internautes nous ont dit merci ce mois-ci

Commenter la réponse de luhtor
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
0
Merci
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)"
Commenter la réponse de luhtor
Messages postés
78
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
3 décembre 2011
0
Merci
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
Commenter la réponse de cs_Turok
Messages postés
78
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
3 décembre 2011
0
Merci
Ok je te remercie. De toute facon puisque ça ne marche pas je suis forcé de comparer les coordonnées de chaque objet.

Turok
Commenter la réponse de cs_Turok