wglCreateContextAttribsARB函数崩溃

时间:2013-12-29 12:47:20

标签: c++ opengl openglcontext

我尝试写下这个tutorial的代码。我有InitializeOGL()的代码:

bool Ogl::InitializeOGL(bool vSync)
{
  cout<<"Init OpenGL"<<endl;
  int pixelFormat;
  PIXELFORMATDESCRIPTOR pixelFormatDescriptor;
  int result;
  char *vendorChar, *rendererChar;

  hDC = GetDC(hWnd);
  if(!hDC)
    return false;

  pixelFormat = ChoosePixelFormat(hDC,&pixelFormatDescriptor);
  if(pixelFormat==0)
    return false;

  result = SetPixelFormat(hDC,pixelFormat,&pixelFormatDescriptor);
  if(result!=1)
    return false;

  HGLRC tempDeviceContext = wglCreateContext(hDC);
  wglMakeCurrent(hDC,tempDeviceContext);

  // glewExperimental = GL_TRUE;
  if(glewInit()!=GLEW_OK)
    return false;

  int attribList[5] = 
  {
    WGL_CONTEXT_MAJOR_VERSION_ARB, 3,
    WGL_CONTEXT_MINOR_VERSION_ARB, 1, 0
  };

  hGLRC = wglCreateContextAttribsARB(hDC,0,attribList);
  if(hGLRC!=NULL)
  {
    wglMakeCurrent(NULL,NULL);
    wglDeleteContext(tempDeviceContext);
    result = wglMakeCurrent(hDC,hGLRC);
    if(result!=1)
      return false;
  }

  vendorChar = (char*)glGetString(GL_VENDOR);
  rendererChar = (char*)glGetString(GL_RENDERER);

  strcpy_s(videoCardInfo,vendorChar);
  strcat_s(videoCardInfo,"-");
  strcat_s(videoCardInfo,rendererChar);

  if(vSync)
    result = wglSwapIntervalEXT(1);
  else
    result = wglSwapIntervalEXT(0);

  if(result!=1)
    return false;

  int glVersion[2] = {-1,-1};
  glGetIntegerv(GL_MAJOR_VERSION,&glVersion[0]);
  glGetIntegerv(GL_MINOR_VERSION,&glVersion[1]);

  cout<<"Initializing OpenGL"<<endl;
  cout<<"OpenGL version"<<glVersion[0]<<"."<<glVersion[1]<<endl;
  cout<<"GPU"<<videoCardInfo<<endl;

  return 0;
}

当我尝试将上下文版本更改为OpenGL 3.1时,此处崩溃 wglCreateContextAttribsARB() function(指针正确地进入 LoadExtensions())。当我尝试创建OpenGL 4.0时,崩溃函数 wglSwapIntervalEXT()。我的图形卡只处理OpenGL 3.1。

我的问题是如何在这里成功初始化OpenGL上下文?我需要做什么才能在3.1版中创建OpenGL上下文。

1 个答案:

答案 0 :(得分:3)

这里有几件事需要提及:

1。驱动程序版本

如果您的显卡/驱动程序仅支持OpenGL 3.1,那么WGL_CONTEXT_MAJOR_VERSION_ARB和朋友通常将是未定义的。在OpenGL 3.2引入核心/兼容性之前,上下文版本没有特别的意义。

  • 这需要支持WGL_ARB_create_contextWGL_ARB_create_conext_profile

2。 ChoosePixelFormatSetPixelFormat

的使用不正确
PIXELFORMATDESCRIPTOR pixelFormatDescriptor; // <--- Uninitialized

至少,Win32 API需要您初始化此结构的size字段。在过去的几年中,结构的大小用于确定为特定代码编写的Windows版本。现在像PIXELFORMATDESCRIPTOR这样的结构通常是静态的,因为它们被不推荐使用的Windows的一部分(GDI)使用,但是如果你没有设置大小,你仍然可以彻底混淆Windows。此外,您需要标记像素格式以支持OpenGL,以保证您可以使用它来创建OpenGL渲染上下文。

另请注意,在Windows上设置设备上下文的像素格式后,无法更改。通常,这意味着如果要创建虚拟渲染上下文来初始化扩展,还应创建一个虚拟像素格式的虚拟窗口。 初始化扩展程序后,您可以使用wglChoosePixelFormatARB (...)及其相关功能选择主窗口设备上下文的像素格式。

这是( )在您想要实施多次采样的FBO之前的日子里特别重要。您无法使用ChoosePixelFormat (...)获取多样本像素格式,但需要调用ChoosePixelFormat (...)来设置获取多样本像素格式所需的扩展名。一种捕获22。