1

我尝试写下本教程中的代码。我有 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() 函数(此指针正确进入LoadExtensions())。当我尝试在这里创建 OpenGL 4.0 时,函数wglSwapIntervalEXT() 会崩溃。我的显卡只处理 OpenGL 3.1。

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

4

1 回答 1

3

这里有几件事需要提到:

1.驱动版本

如果你的显卡/驱动只支持O​​penGL 3.1,那么WGL_CONTEXT_MAJOR_VERSION_ARB和朋友一般会是undefined。在 OpenGL 3.2 引入核心/兼容性之前,上下文版本并不是特别有意义。

  • 这需要支持WGL_ARB_create_contextWGL_ARB_create_conext_profile

ChoosePixelFormat2.和的错误使用SetPixelFormat

PIXELFORMATDESCRIPTOR pixelFormatDescriptor; // <--- Uninitialized

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

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

在 FBO 之前的日子里,当您想要实施多重采样时,这一点(曾经)特别重要。您无法使用 获得多样本像素格式ChoosePixelFormat (...),但您需要调用ChoosePixelFormat (...)以设置获得多样本像素格式所需的扩展。有点像 22。

于 2013-12-30T19:01:01.160 回答