我的OpenGL应用程序适用于ATI,但不适用于nNVIDIA pc

时间:2016-03-07 12:43:59

标签: c++ opengl

我正在开发一个使用C ++和OpenGL作为学习项目的游戏引擎。当我在我的家用电脑,它有一个ATI显卡,一切都很好。到目前为止,所有引擎都能做的就是显示一个精灵,并且没有任何问题。在工作中,有两台带有NVIDIA卡的Windows PC,当我运行该程序时,它就好像OpenGL不在这里一样。

我检查了glGetIntegerv(GL_MAJOR_VERSION); glGetIntegerv(GL_MINOR_VERSION);,结果是4.5

这是我的初始化函数:

    namespace windows
    {
        HGLRC OpenGLWindows::hglrc;

        bool OpenGLWindows::initialize(HWND& hwnd, HDC& hdc)
        {   
            PIXELFORMATDESCRIPTOR pfd;

            const int pixelFormatAttribList[] =
            {
                WGL_DRAW_TO_WINDOW_ARB, GL_TRUE,
                WGL_SUPPORT_OPENGL_ARB, GL_TRUE,
                WGL_DOUBLE_BUFFER_ARB, GL_TRUE,
                WGL_PIXEL_TYPE_ARB, WGL_TYPE_RGBA_ARB,
                WGL_COLOR_BITS_ARB, 32,
                WGL_DEPTH_BITS_ARB, 24,
                WGL_STENCIL_BITS_ARB, 8,
                0,        //End
            };



            //choose pixel format
            int     pixelFormat;
            UINT    numFormats;

            //dummy context
            hglrc = wglCreateContext(hdc);
            wglMakeCurrent(hdc, hglrc);

            //initialize glew
            glewExperimental = TRUE;
            GLenum err = glewInit();
            std::cout << glewGetErrorString(err) << std::endl;
            if (err != GLEW_OK)
            {
                std::cout << "Error: GLEW couldn't be initialized = " << glewGetErrorString(err) << std::endl;
                return false;
            }


            assert(hwnd != NULL);

            //set pixel format

            if (!WGL_ARB_pixel_format) errorQuit("WGL_ARB_pixel_format not supported");
            wglChoosePixelFormatARB = (PFNWGLCHOOSEPIXELFORMATARBPROC)wglGetProcAddress("wglChoosePixelFormatARB");
            if (!wglChoosePixelFormatARB(hdc, pixelFormatAttribList, NULL, 1, &pixelFormat, &numFormats))
            {
                std::cout << "Error: pixel format could not be created" << std::endl;
            }
            else
            {
                SetPixelFormat(hdc, pixelFormat, &pfd);
            }

            //create real context
            int contextAttribList[5] =
            {
                WGL_CONTEXT_MAJOR_VERSION_ARB, 3,
                WGL_CONTEXT_MINOR_VERSION_ARB, 0, 0
            };
            if (!WGL_ARB_create_context) errorQuit("WGL_ARB_create_context not supported");
            wglCreateContextAttribsARB = (PFNWGLCREATECONTEXTATTRIBSARBPROC)wglGetProcAddress("wglCreateContextAttribsARB");
            hglrc = wglCreateContextAttribsARB(hdc, 0, contextAttribList);

            if (!wglMakeCurrent(hdc, hglrc))
            {
                errorQuit("OpenGL context creation failed");
            }

            GLint major;
            GLint minor;
            glGetIntegerv(GL_MAJOR_VERSION, &major);
            glGetIntegerv(GL_MINOR_VERSION, &minor);
            std::cout << "GL version = " << major << "." << minor << std::endl;

            std::cout << glGetString(GL_VENDOR) << std::endl;
            std::cout << glGetString(GL_RENDERER) << std::endl;

            glEnable(GL_BLEND);
            glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

            return true;
        }

        void    OpenGLWindows::shutDown(HWND& hwnd, HDC& hdc)
        {
            wglMakeCurrent(hdc, NULL);
            wglDeleteContext(hglrc);
        }
    }

我正在寻找几个小时的论坛,我发现这个主题的主题总是崩溃,他们的解决方案无效。我没有遇到任何崩溃,只是一个窗口,我创建窗口上下文时指定的颜色。我不知道我做错了什么。

编辑:我刚创建了一个完整的虚拟窗口,现在它也适用于NVIDIA。

1 个答案:

答案 0 :(得分:1)

您正在尝试使用WGL_ARB_pixel_format扩展名,并且遇到了一些鸡与蛋的问题:要获取扩展函数指针,首先要创建GL上下文。但是,要创建GL上下文,您需要先为您的窗口设置像素格式reference page for wglCreateContext明确说明:

  

渲染上下文与设备上下文不同。 在创建渲染上下文之前设置设备上下文的像素格式。

所以你必须使用标准ChoosePixelFormat()&amp; SetPixelFormat()方法可靠地创建帮助程序上下文以查询WGL扩展。

但是,SetPixelFormat不得在同一窗口上多次使用:

  

多次设置窗口的像素格式会导致Window Manager和多线程应用程序出现严重的复杂情况,因此不允许这样做。 应用程序只能设置一次窗口的像素格式。设置窗口的像素格式后,无法更改。

这意味着当“真实”上下文的第二个像素格式与虚拟像素格式不同时,您的方法将失败。这就是为什么人们通常会为虚拟上下文使用一个单独的窗口(可能永远不会映射到屏幕),并立即再次销毁它。