C++ 激活多重采样(Windows)时,如何防止OpenGL窗口为空?

C++ 激活多重采样(Windows)时,如何防止OpenGL窗口为空?,c++,visual-studio,opengl,C++,Visual Studio,Opengl,我正在Visual Studio 10中使用OpenGL 3D可视化开发一个应用程序。可视化控制是用C++编写的。 在初始化OpenGL窗口时,我尝试通过直接使用扩展wglChoosePixelFormatARB来启用多重采样 正如我已经了解到的,首先必须创建一个虚拟窗口,并使用适当的属性调用wglchoospexixelformatarb。后来我使用这个方法返回的像素格式来创建真正的3D窗口。在我的代码中,调用如下所示: const int attribs[] = { WGL_DRAW

我正在Visual Studio 10中使用OpenGL 3D可视化开发一个应用程序。可视化控制是用C++编写的。 在初始化OpenGL窗口时,我尝试通过直接使用扩展wglChoosePixelFormatARB来启用多重采样

正如我已经了解到的,首先必须创建一个虚拟窗口,并使用适当的属性调用wglchoospexixelformatarb。后来我使用这个方法返回的像素格式来创建真正的3D窗口。在我的代码中,调用如下所示:

const int attribs[] = {
    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,
    WGL_SAMPLE_BUFFERS_ARB, GL_TRUE,
    WGL_SAMPLES_ARB, m_multiSample,
    0
};

if(wglChoosePixelFormatARB(hdc,attribs,NULL,1,&pixelformat,&numFormats)!=0 && pixelformat>0) {
    m_pixelFormat = pixelformat;
}         
然后,我调用SetPixelFormat,为新窗口调用前面找到的pixelformat

整个过程在某些配置下运行良好,但对于GPU和WGL_SAMPLES_ARB值的特定组合,我收到的pixelformat值似乎正常,但当我使用此pixelformat创建新窗口时,此窗口保持空白白色或灰色-例如,当在我的笔记本电脑中使用“英特尔高清图形”时,WGL_SAMPLES_ARB的设置为8,窗口保持白色-使用4可以完美工作


我现在的问题是,我无法从程序中找到检查当前像素格式设置是否有效的方法。我非常感谢您对如何处理这些情况的任何帮助。

直接取自WGL规范:

如果未找到匹配的格式,则nNumFormats将设置为零,函数将返回TRUE

要验证是否找到匹配的像素格式,您真正想做的是测试“numFormats”的值。。。因为您在这里请求的是完美匹配的像素格式,如果在调用wglChoosePixelFormat…,之后numFormats不是1,那么您就知道出了问题。实际上,将pixelformat>0条件更改为numFormats==1

另一方面,我甚至不再麻烦使用窗口系统在我的软件中设置多重采样-使用帧缓冲区对象更方便,您可以动态更改抗锯齿,而无需以这种方式创建新的渲染上下文

无论如何,多样本功能因卡而异,甚至配置也不尽相同。在AMD硬件上,在CrossFire配置中,您可以进行16倍多采样,而单GPU解决方案最多只能提供8倍


在识别任何给定主机上支持的全部MSAA样本计数之前,您可能必须执行多个像素格式查询。FBO肯定更方便:

非常感谢您指出这一点。就在我眼皮底下。。当我有时间的时候,我也会尝试使用帧缓冲区对象。