我正在开发一个使用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。答案 0 :(得分:1)
您正在尝试使用WGL_ARB_pixel_format
扩展名,并且遇到了一些鸡与蛋的问题:要获取扩展函数指针,首先要创建GL上下文。但是,要创建GL上下文,您需要先为您的窗口设置像素格式:reference page for wglCreateContext
明确说明:
渲染上下文与设备上下文不同。 在创建渲染上下文之前设置设备上下文的像素格式。
所以你必须使用标准ChoosePixelFormat()
&amp; SetPixelFormat()
方法可靠地创建帮助程序上下文以查询WGL扩展。
但是,SetPixelFormat
不得在同一窗口上多次使用:
多次设置窗口的像素格式会导致Window Manager和多线程应用程序出现严重的复杂情况,因此不允许这样做。 应用程序只能设置一次窗口的像素格式。设置窗口的像素格式后,无法更改。
这意味着当“真实”上下文的第二个像素格式与虚拟像素格式不同时,您的方法将失败。这就是为什么人们通常会为虚拟上下文使用一个单独的窗口(可能永远不会映射到屏幕),并立即再次销毁它。