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 :

Problème d'écran noir openGL


Sujet :

OpenGL

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 11
    Points : 7
    Points
    7
    Par défaut Problème d'écran noir openGL
    Bonjour,

    je souhaite débuter avec opengl. Après avoir installé la lib, j'ai compilé un petit programme test (copier/coller d'un tutorial de Nehe).
    L'appli se lance. La fenêtre s'ouvre, mais l'écran reste désespérément noir. Quelqu'un a-t-il déjà rencontré ce problème ou a-t-il une idée sur la cause?

    Merci

  2. #2
    Membre averti Avatar de zabibof
    Inscrit en
    Février 2007
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 188
    Points : 344
    Points
    344
    Par défaut
    Si c'est un copier/coller d'un tutoriel de NeHe, lequel?
    Si c'est le 1, alors, c'est normal, c'est juste l'initialisation d'OpenGL.

  3. #3
    Yno
    Yno est déconnecté
    Membre habitué Avatar de Yno
    Inscrit en
    Novembre 2005
    Messages
    138
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 138
    Points : 141
    Points
    141
    Par défaut
    Citation Envoyé par Elwood Voir le message
    j'ai compilé un petit programme test (copier/coller d'un tutorial de Nehe).
    Copier/coller est une opération inutile avec NeHe dans la mesure où ils te proposent toujours en fin de page des liens de téléchargement vers les sources du sujet étudié, généralement plusieurs langages/plateformes sont disponibles, tu devrais pouvoir trouver ton bonheur.

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Bonsoir, merci pour vos réponses.

    Le tutoriel était le 1 auquel j'ai ajouté le triangle du 2. J'ai également fait le test avec les exemples fournit avec code::blocks et devcpp.
    En fait j'ai fait une erreur, j'obtenais un écran noir pour le code exemple sous devcpp (à la place d'obtenir un triangle) et j'obtiens une fenêtre gelée/transparente (lorsque je la bouge, elle garde l'image des fenêtres en arrière plan présentent au moment du lancement de l'exécutable) lorsque je construis le projet avec l'environnement Code::blocks.

    Un autre point est que le programme se quitte normalement lorsque j'appuie sur échap.

    Est ce que les écran noir et gelé peuvent être liés à des problèmes dans mon environnement openGL (dlls ou autres... ) ?

    Merci beaucoup.

  5. #5
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Bonjour,

    montre nous tes fonctions qui gère ton affichage, peut être repèrerons nous une erreur.

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Bonjour,

    merci d'avoir lu la description de mon problème.
    Voici la fonction main avec la fonction d'initialisation EnableOpenGL.

    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
     
    LRESULT CALLBACK WndProc (HWND hWnd, UINT message,
    WPARAM wParam, LPARAM lParam);
    void EnableOpenGL (HWND hWnd, HDC *hDC, HGLRC *hRC);
    void DisableOpenGL (HWND hWnd, HDC hDC, HGLRC hRC);
     
    /**************************
     * WinMain
     *
     **************************/
     
    int WINAPI 
    WinMain (HINSTANCE hInstance,
             HINSTANCE hPrevInstance,
             LPSTR lpCmdLine,
             int iCmdShow)
    {
        WNDCLASS wc;
        HWND hWnd;
        HDC hDC;
        HGLRC hRC;        
        MSG msg;
        BOOL bQuit = FALSE;
        float theta = 0.0f;
     
        /* register window class */
        wc.style = CS_OWNDC;
        wc.lpfnWndProc = WndProc;
        wc.cbClsExtra = 0;
        wc.cbWndExtra = 0;
        wc.hInstance = hInstance;
        wc.hIcon = LoadIcon (NULL, IDI_APPLICATION);
        wc.hCursor = LoadCursor (NULL, IDC_ARROW);
        wc.hbrBackground = (HBRUSH) GetStockObject (BLACK_BRUSH);
        wc.lpszMenuName = NULL;
        wc.lpszClassName = "GLSample";
        RegisterClass (&wc);
     
        /* create main window */
        hWnd = CreateWindow (
          "GLSample", "OpenGL Sample", 
          WS_CAPTION | WS_POPUPWINDOW | WS_VISIBLE,
          0, 0, 256, 256,
          NULL, NULL, hInstance, NULL);
     
        /* enable OpenGL for the window */
        EnableOpenGL (hWnd, &hDC, &hRC);
     
        /* program main loop */
        while (!bQuit)
        {
            /* check for messages */
            if (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE))
            {
                /* handle or dispatch messages */
                if (msg.message == WM_QUIT)
                {
                    bQuit = TRUE;
                }
                else
                {
                    TranslateMessage (&msg);
                    DispatchMessage (&msg);
                }
            }
            else
            {
                /* OpenGL animation code goes here */
     
                glClearColor (0.0f, 0.0f, 0.0f, 0.0f);
                glClear (GL_COLOR_BUFFER_BIT);
     
                glPushMatrix ();
                glRotatef (theta, 0.0f, 0.0f, 1.0f);
                glBegin (GL_TRIANGLES);
                glColor3f (1.0f, 0.0f, 0.0f);   glVertex2f (0.0f, 1.0f);
                glColor3f (0.0f, 1.0f, 0.0f);   glVertex2f (0.87f, -0.5f);
                glColor3f (0.0f, 0.0f, 1.0f);   glVertex2f (-0.87f, -0.5f);
                glEnd ();
                glPopMatrix ();
     
                SwapBuffers (hDC);
     
                theta += 1.0f;
                Sleep (1);
            }
        }
     
        /* shutdown OpenGL */
        DisableOpenGL (hWnd, hDC, hRC);
     
        /* destroy the window explicitly */
        DestroyWindow (hWnd);
     
        return msg.wParam;
    }
     
    /*******************
     * Enable OpenGL
     *
     *******************/
     
    void EnableOpenGL (HWND hWnd, HDC *hDC, HGLRC *hRC)
    {
        PIXELFORMATDESCRIPTOR pfd;
        int iFormat;
     
        /* get the device context (DC) */
        *hDC = GetDC (hWnd);
     
        /* set the pixel format for the DC */
        ZeroMemory (&pfd, sizeof (pfd));
        pfd.nSize = sizeof (pfd);
        pfd.nVersion = 1;
        pfd.dwFlags = PFD_DRAW_TO_WINDOW | 
          PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
        pfd.iPixelType = PFD_TYPE_RGBA;
        pfd.cColorBits = 24;
        pfd.cDepthBits = 16;
        pfd.iLayerType = PFD_MAIN_PLANE;
        iFormat = ChoosePixelFormat (*hDC, &pfd);
        SetPixelFormat (*hDC, iFormat, &pfd);
     
        /* create and enable the render context (RC) */
        *hRC = wglCreateContext( *hDC );
        wglMakeCurrent( *hDC, *hRC );
    }

  7. #7
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Bonjour,

    Citation Envoyé par Elwood Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
                glClearColor (0.0f, 0.0f, 0.0f, 0.0f);
                glClear (GL_COLOR_BUFFER_BIT);
     
                glPushMatrix ();
                glRotatef (theta, 0.0f, 0.0f, 1.0f);
                glBegin (GL_TRIANGLES);
                glColor3f (1.0f, 0.0f, 0.0f);   glVertex2f (0.0f, 1.0f);
                glColor3f (0.0f, 1.0f, 0.0f);   glVertex2f (0.87f, -0.5f);
                glColor3f (0.0f, 0.0f, 1.0f);   glVertex2f (-0.87f, -0.5f);
                glEnd ();
                glPopMatrix ();
    Hormis le fait que ta fonction d'affichage à un style très particulier et peu lisible à mon goût, je pense que ton problème vient de ces quelques lignes ci-dessus :
    - Quand tu utilises un glVertex, les coordonnées sont en... PIXEL. Là tu essaies de dessiner un triangle dont la surface est inférieure à un pixel carré . Or un pixel carré et bien... c'est la surface d'un pixel

    Bonne continuation...

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    216
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 216
    Points : 74
    Points
    74
    Par défaut
    Citation Envoyé par ToTo13 Voir le message
    - Quand tu utilises un glVertex, les coordonnées sont en... PIXEL. Là tu essaies de dessiner un triangle dont la surface est inférieure à un pixel carré . Or un pixel carré et bien... c'est la surface d'un pixel
    Es-tu sur de ce que tu raconte ? Il me semblait que le centre de l'écran était 0.0f;0.0f et le coin en haut à droite était 1.0f;1.0f

    Je dirait plutot que son problème vient du fait que le triangle est positionné en z=0.0f
    Dans le tuto de nehe, il fait un glTranslatef(-1.5f,0.0f,-6.0f); pour régler le "problème"....

    Mais je peux me tromper

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Merci pour toutes vos réponses. Cependant, après avoir testé diverses tailles pour les vertexs et testé la translation, j'ai téléchargé un exécutable (qui utilise glut en plus d'opengl)... Et là, l'écran se gèle... Du coup la source de mes problèmes ne semble pas provenir des codes. J'ai testé ce même programme sur un autre pc comportant les mêmes dll opengl32, glu32 et glut32 dans le répertoire system32. Et sur cet autre pc, ça marche.

    Je ne vois pas vraiment d'où peut venir le problème désormais . Toute suggestion sera la bienvenue

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Bonjour,

    j'ai finalement résolu mon pb. C'était principalement dû à un manque de connaissance sur openGL. Je ne savais pas que la couche d'affichage pour openGL était gérée par Direct3D sous windows (je pensais que c'était le cas uniquement pour directX ). Et lorsque j'ai lancé dxdiag, je me suis rendu compte que les fonctionnalités direct3D étaient tout simplement désactivées :/ .

    Encore merci à tous ceux qui m'ont répondu et désolé pour cette perte de temps.

  11. #11
    Membre éclairé
    Avatar de Happy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2005
    Messages
    665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Autre

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2005
    Messages : 665
    Points : 875
    Points
    875
    Par défaut
    Je ne savais pas que la couche d'affichage pour openGL était gérée par Direct3D sous windows

  12. #12
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par Happy Voir le message
    D'accord, c'était peut être évident pour toi, mais pas pour moi. Comme je l'ai dit, je suis débutant en OpenGL. Maintenant tout marche correctement.

  13. #13
    Membre éclairé
    Avatar de Happy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2005
    Messages
    665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Autre

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2005
    Messages : 665
    Points : 875
    Points
    875
    Par défaut
    Non OpenGL ne passe pas par Direct3D; il était question sous vista et leurs politique un peu drôle. Du coup ça devenait lent.
    Ce n'est plus le cas avec les nouveaux drivers graphiques donc.

    Sinon, on dessine en PIXELS quand on utilise gluOrtho2D() par exemple..

  14. #14
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Aouch, alors je me suis complètement fourvoyé . Merci pour l'info. Mais alors comment se fait-il que ça ne fonctionnait pas quand Direct3D était désactivé? Tout fonctionne parfaitement depuis que je l'ai activé en utilisant dxdiag (et c'est le seul truc auquel j'ai touché consciemment). Si tu connais la réponse, ça m'intéresse de comprendre pourquoi ça marche

  15. #15
    Membre éclairé
    Avatar de Happy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2005
    Messages
    665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Autre

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2005
    Messages : 665
    Points : 875
    Points
    875
    Par défaut
    Désolé de ne pas pouvoir apporter plus d'arguments, je ne suis pas sous windows, mais normalement à ma connaissance dxdiag n'a pas de liaison avec OpenGL.

  16. #16
    Membre averti Avatar de zabibof
    Inscrit en
    Février 2007
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 188
    Points : 344
    Points
    344
    Par défaut
    Et ce n'était pas l'accélération matérielle qui était désactivée?

  17. #17
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Bonjour,

    Citation Envoyé par casafa Voir le message
    Es-tu sur de ce que tu raconte ? Il me semblait que le centre de l'écran était 0.0f;0.0f et le coin en haut à droite était 1.0f;1.0f
    J'ai eu le problème avant hier (lundi 10) avec une de mes élèves qui se servait des coordonnées entre [-1.0,1.0] dans un glVertex2f. Rien ne s'affichait à l'écran ou plutôt si, un seul pixel était noir. on a résolu le problème mettant les coordonnées en pixels.
    Donc ce que j'ai dit est juste (tu m'as fait douté).
    Il y a peut être un option dans OpenGL qui permet d'utiliser glVertex2f sur [-1,1] mais je ne la connais pas.

  18. #18
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 9
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par ToTo13 Voir le message
    Bonjour,
    J'ai eu le problème avant hier (lundi 10) avec une de mes élèves qui se servait des coordonnées entre [-1.0,1.0] dans un glVertex2f. Rien ne s'affichait à l'écran ou plutôt si, un seul pixel était noir. on a résolu le problème mettant les coordonnées en pixels.
    Donc ce que j'ai dit est juste (tu m'as fait douté).
    Il y a peut être un option dans OpenGL qui permet d'utiliser glVertex2f sur [-1,1] mais je ne la connais pas.
    Bof, il n'y a pas de règles prédéfinies, les coordonnées passées à glVertex sont les coordonnées dans l'espace. Après pour savoir où ça va s'afficher à l'écran, ça dépend de ce que vous mettez dans votre matrice de projection, et donc des paramètres de glOrtho ou équivalent.

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

Discussions similaires

  1. [iOS 4.x] problème d'écran noir lors du passage de iOS3.* vers iOS4.0
    Par Leena Asakura dans le forum Objective-C
    Réponses: 0
    Dernier message: 02/08/2010, 17h12
  2. Problème d'écran noir, d'un coup!
    Par Remizkn dans le forum Composants
    Réponses: 5
    Dernier message: 07/01/2010, 15h17
  3. [OpenGL] Problème d'affichage : écran noir
    Par Enkel dans le forum OpenGL
    Réponses: 1
    Dernier message: 06/01/2010, 19h33
  4. Réponses: 10
    Dernier message: 18/07/2007, 19h15
  5. Visual C++ 6 : Problème impression d'écran noir
    Par charliejo dans le forum MFC
    Réponses: 6
    Dernier message: 24/01/2005, 09h52

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