我尝试写下这个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上下文。
答案 0 :(得分:3)
这里有几件事需要提及:
如果您的显卡/驱动程序仅支持OpenGL 3.1,那么WGL_CONTEXT_MAJOR_VERSION_ARB
和朋友通常将是未定义的。在OpenGL 3.2引入核心/兼容性之前,上下文版本没有特别的意义。
WGL_ARB_create_context
或WGL_ARB_create_conext_profile
。ChoosePixelFormat
和SetPixelFormat
PIXELFORMATDESCRIPTOR pixelFormatDescriptor; // <--- Uninitialized
至少,Win32 API需要您初始化此结构的size字段。在过去的几年中,结构的大小用于确定为特定代码编写的Windows版本。现在像PIXELFORMATDESCRIPTOR
这样的结构通常是静态的,因为它们被不推荐使用的Windows的一部分(GDI)使用,但是如果你没有设置大小,你仍然可以彻底混淆Windows。此外,您需要标记像素格式以支持OpenGL,以保证您可以使用它来创建OpenGL渲染上下文。
另请注意,在Windows上设置设备上下文的像素格式后,无法更改。通常,这意味着如果要创建虚拟渲染上下文来初始化扩展,还应创建一个虚拟像素格式的虚拟窗口。 初始化扩展程序后,您可以使用wglChoosePixelFormatARB (...)
及其相关功能选择主窗口设备上下文的像素格式。
这是( )在您想要实施多次采样的FBO之前的日子里特别重要。您无法使用ChoosePixelFormat (...)
获取多样本像素格式,但需要调用ChoosePixelFormat (...)
来设置获取多样本像素格式所需的扩展名。一种捕获22。