我正在使用Visual Studio 10中的OpenGL 3D可视化开发应用程序。可视化的控件是用C ++编写的。 在初始化OpenGL窗口时,我尝试通过直接使用扩展(wglChoosePixelFormatARB)启用多重采样。
正如我已经了解到的那样,首先必须创建一个虚拟窗口并使用适当的属性调用“wglChoosePixelFormatARB”。后来我使用此方法返回的“pixelformat”来创建真实的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;
}
然后我使用之前找到的pixelformat为新窗口调用SetPixelFormat
。
整个过程适用于某些配置,但是使用GPU的特定组合和WGL_SAMPLES_ARB
的值我会收到pixelformat的值似乎没问题,但是当我用这个pixelformat创建一个新窗口时,这个窗口保持空白(白色或灰色) - 例如在我的笔记本中使用英特尔高清显卡时,WGL_SAMPLES_ARB
的设置为8,窗口保持白色 - 使用4个效果完美。
我现在的问题是,如果当前的pixelformat设置有效,我找不到从程序中检查的方法。我非常感谢有关如何处理这些情况的任何帮助。
答案 0 :(得分:0)
直接取自WGL规范:
“如果找不到匹配的格式,则nNumFormats设置为零,函数返回TRUE。”
您确实要验证找到匹配的像素格式的目的是测试'numFormats'的值......因为您在这里请求完美匹配的像素格式,如果numFormats是在调用wglChoosePixelFormat(...)之后,除了1以外的任何东西,那么你就知道出了什么问题。有效地,改变pixelformat> 0条件为numFormats == 1.
另一方面,我甚至不再费心使用窗口系统在我的软件中设置多次采样 - 使用帧缓冲对象更方便,你可以在不改变的情况下改变你的抗锯齿必须以这种方式创建一个新的渲染上下文。
无论如何,多样本功能因卡与卡甚至配置而异。在AMD硬件上,在CrossFire配置中,您可以执行16倍多重采样,而单GPU解决方案仅提供8倍最大采样。
在识别任何给定主机上支持的所有MSAA样本计数之前,您可能必须执行多个像素格式查询。 FBO绝对更方便:)