OpenGL в C ++ - вылетает во время выполнения - PullRequest
0 голосов
/ 18 февраля 2009

Я работаю над некоторыми OpenGL в C ++ в Visual Studio 2005.

// 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 находится там, где происходит взрыв во время выполнения. Раздражает то, что он падает только на моей машине, а не на коллеге.

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

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

Ответы [ 3 ]

1 голос
/ 19 февраля 2009

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

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

0 голосов
/ 18 февраля 2009

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

0 голосов
/ 18 февраля 2009

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

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

Откуда приходит pWnd?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...