2009-02-18 6 views
0

je travaille sur certains OpenGL en C++ dans Visual Studio 2005.OpenGL en C++ - plantages lors de l'exécution

// SetUpOpenGL sets the pixel format and a rendering 
// context then returns the RC 
HGLRC COpenGLBaseWnd::SetUpOpenGL(HWND hwnd) 
{ 
    static PIXELFORMATDESCRIPTOR pfd = 
    { 
     sizeof (PIXELFORMATDESCRIPTOR), // strcut size 
     1,        // Version number 
     PFD_DRAW_TO_WINDOW | // Flags, draw to a window, 
      PFD_DOUBLEBUFFER | // enable double buffering 
      PFD_SUPPORT_OPENGL, // use OpenGL 
     PFD_TYPE_RGBA,   // RGBA pixel values 
     24,      // 24-bit color 
     0, 0, 0,    // RGB bits & shift sizes. 
     0, 0, 0,    // Don't care about them 
     0, 0,     // No alpha buffer info 
     0, 0, 0, 0, 0,   // No accumulation buffer 
     32,      // 32-bit depth buffer 
     0,      // No stencil buffer 
     0,      // No auxiliary buffers 
     PFD_MAIN_PLANE,   // Layer type 
     0,      // Reserved (must be 0) 
     0,      // No layer mask 
     0,      // No visible mask 
     0      // No damage mask 
    }; 

    pCDC = pWnd->GetDC(); 
    hDC = pCDC->GetSafeHdc(); 

    PixelFormatID = ChoosePixelFormat(hDC, &pfd); 

    if (!PixelFormatID) 
    { 
     // catch errors here. 
     // If nMyPixelFormat is zero, then there's 
     // something wrong... most likely the window's 
     // style bits are incorrect (in CreateWindow()) 
     // or OpenGl isn't installed on this machine 
     //printf("ChoosePixelFormat Failed %d\r\n",GetLastError()); 
     abort(); 
     exit(-1); 
    } 

    if (pfd.dwFlags & PFD_NEED_PALETTE) 
    { 
     //printf("Choosen Pixel Format requires a palette.\r\n"); 
     abort(); 
     exit(-1); 
    } 

    SetPixelFormat(hDC, PixelFormatID, &pfd); 

Et c'est appel SetPixelFormat où il va bang au cours de l'exécution. Ce qui est agaçant, c'est que ça ne fait que s'écraser sur ma machine, pas sur celle de mon collègue.

J'ai trouvé this answer, qui semble lié, sur stackoverflow, mais soit je ne sais pas quoi faire pour résoudre le problème en utilisant ces informations en C++, ou ce n'est pas le même problème.

J'ai besoin de conseils sur la façon d'implémenter cette solution en C++, ou d'autres solutions potentielles.

+0

Je pense que vous n'avez soumis que la moitié de votre question par accident? – Kosi2801

+0

Oh, beaucoup moins que la moitié, comme il se trouve. – deworde

+0

S'agit-il d'une erreur de lien ou d'un plantage? Ce sont des bêtes différentes. – dirkgently

Répondre

0

Vérifiez si vos pointeurs sont NULL.

Votre carte vidéo peut ne pas prendre en charge le format de pixel spécifié. Essayez d'autres paramètres. Quelle carte vidéo avez-vous? Comparé à un autre sur lequel cela a fonctionné.

D'où vient le pWnd?

+0

ChoosePixelFormat correspondra au format de pixel le plus proche si celui que vous demandez n'est pas disponible - mais je ne l'ai jamais vu échouer. –

+0

Oui, Choisir ne manque pas, mais il semble que Set est. Et je sais si peu de choses sur OpenGL que ma capacité à diagnostiquer le problème est faible. Les valeurs de ce truc dans le débogage semblent raisonnables (sauf peut-être hDC). Aucun pointeur n'est NULL. – deworde

0

Vous avez mentionné une erreur de liaison et un blocage. Pouvez-vous vérifier si votre fichier objet a une définition pour la fonction où il se bloque? Utilisez-vous le bon lib pour lier l'OpenGL?

+0

L'erreur de l'éditeur de liens fait référence à la réponse liée à la question. L'éditeur de liens réussit, mais d'après la réponse à laquelle je me suis connecté, c'est l'ordre dans lequel il se comporte qui cause des problèmes. – deworde

1

Assurez-vous que lorsque vous créez la classe de fenêtre, CS_PARENTDC n'est pas spécifié et CS_OWNDC est. Si SetPixelFormat() détecte que le contrôleur de domaine est partagé (l'effet de déconner l'un des indicateurs ci-dessus) Je ne sais pas, mais OpenGL ne fonctionnera pas correctement à moins que la fenêtre ait une valeur de CDH dédiée.

Questions connexes