【问题标题】:OpenGL in C++ - Crashes at runtimeC++ 中的 OpenGL - 运行时崩溃
【发布时间】:2009-02-18 14:20:16
【问题描述】:

我正在 Visual Studio 2005 中使用 C++ 编写一些 OpenGL。

// 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 上找到了看起来相关的 this answer,但要么我不知道如何在 C++ 中使用此信息解决问题,要么不是同一个问题。

我需要有关如何在 C++ 或其他潜在解决方案中实现该解决方案的建议。

【问题讨论】:

  • 我认为您不小心提交了一半的问题?
  • 哦,原来还不到一半。
  • 是链接错误还是崩溃?它们完全是不同的野兽。
  • 哪个 OpenGL 调用?在这个sn-p中我看不到任何东西。 SetPixelFormat() 是 Win32 API 调用,而不是 OpenGL。
  • 抱歉,我已经改写了问题以使其更清楚。链接器错误是指我在其他地方找到并在问题中链接到的答案。链接器,但显然链接的顺序很重要。

标签: c++ visual-studio opengl


【解决方案1】:

确保在创建窗口类时,不指定CS_PARENTDC,而指定CS_OWNDC

SetPixelFormat() 是否检测到 DC 是共享的(弄乱上述任一标志的影响)我不知道,但除非窗口具有专用的 hDC 值,否则 OpenGL 将无法正常工作。

【讨论】:

    【解决方案2】:

    检查你的指针是否为NULL。

    您的视频卡可能不支持指定的像素格式。尝试其他设置。 你有什么视频卡?与它工作的另一个相比。

    pWnd 从何而来?

    【讨论】:

    • 如果您请求的像素格式不可用,ChoosePixelFormat 将匹配最接近的像素格式 - 不过我从未见过它失败。
    • 是的,Choose 没有失败,但看起来 Set 失败了。而且我对openGL知之甚少,以至于我诊断问题的能力很低。调试中这些东西的值似乎是合理的(可能除了hDC)。没有指针是 NULL。
    【解决方案3】:

    您提到了链接器错误和崩溃。你能检查你的目标文件是否有它崩溃的函数的定义吗?你是用正确的lib链接OpenGL吗?

    【讨论】:

    • 链接器错误是指问题中链接到的答案。链接器成功了,但根据我链接到的答案,它的执行顺序会导致问题。
    猜你喜欢
    • 1970-01-01
    • 2021-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多