2009-02-18 6 views
0

я работаю на некоторые OpenGL в C++ в Visual Studio 2005.OpenGL в C++ - Сбои во время выполнения

// 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); 

И SetPixelFormat вызов, где он идет взрыв во время выполнения. Досадно, что это только на моей машине, но не на моем коллеге.

Я нашел this answer, который выглядит связанным, на stackoverflow, но либо я не знаю, что делать, чтобы исправить проблему, используя эту информацию на C++, или это не та же проблема.

Мне нужен совет о том, как реализовать это решение на C++ или других потенциальных решениях.

+0

Я думаю, что вы представили только половину своего вопроса случайно? – Kosi2801

+0

О, гораздо меньше половины, как выясняется. – deworde

+0

Это ошибка связи или сбой? Они совсем другие звери. – dirkgently

ответ

0

Проверьте, не указаны ли ваши указатели NULL.

Возможно, ваша видеокарта не поддерживает указанный формат пикселей. Попробуйте другие настройки. Какая у вас видеокарта? По сравнению с другим, на котором он работал.

Откуда берутся pWnd?

+0

ChoosePixelFormat будет соответствовать ближайшему пиксельному формату, если тот, который вы запрашиваете, не является avialable - я никогда не видел его неудачу. –

+0

Да, выбор не терпит неудачу, но он выглядит как Set is. И я так мало знаю об openGL, что моя способность диагностировать проблему - НИЗКАЯ. Значения для этого материала в отлаживании кажутся разумными (кроме, возможно, hDC). Нет указателей NULL. – deworde

0

Вы упомянули ошибку компоновщика и сбой. Можете ли вы проверить, имеет ли ваш объектный файл определение функции, в которой он сбой? Вы используете правильный lib, чтобы связать OpenGL?

+0

Ошибка компоновщика относится к ответу, связанному с вопросом. Линкером удастся, но в соответствии с ответом, с которым я связался, это порядок, который он делает в этом, что вызывает проблемы. – deworde

1

Убедитесь, что при создании класса окна CS_PARENTDC не указан и CS_OWNDC есть.

SetPixelFormat() обнаруживает, что DC является общим (эффект испортить любой из вышеуказанных флагов). Я не знаю, но OpenGL не будет работать должным образом, если только окно не имеет выделенного значения hDC.

Смежные вопросы