C++ 激活多重采样(Windows)时,如何防止OpenGL窗口为空?
我正在Visual Studio 10中使用OpenGL 3D可视化开发一个应用程序。可视化控制是用C++编写的。 在初始化OpenGL窗口时,我尝试通过直接使用扩展wglChoosePixelFormatARB来启用多重采样 正如我已经了解到的,首先必须创建一个虚拟窗口,并使用适当的属性调用wglchoospexixelformatarb。后来我使用这个方法返回的像素格式来创建真正的3D窗口。在我的代码中,调用如下所示: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
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肯定更方便:非常感谢您指出这一点。就在我眼皮底下。。当我有时间的时候,我也会尝试使用帧缓冲区对象。