1

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

正如我已经了解到的,您首先必须创建一个虚拟窗口并使用适当的属性调用“wglChoosePixelFormatARB”。后来我使用此方法返回的“像素格式”来创建真正的 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用之前找到的像素格式调用新窗口。

整个过程适用于某些配置,但对于 GPU 和值的特定组合,WGL_SAMPLES_ARB我收到的像素格式值似乎没问题,但是当我使用这种像素格式创建一个新窗口时,这个窗口保持为空(白色或灰色) -例如,在我的笔记本电脑中使用英特尔高清显卡时,WGL_SAMPLES_ARB窗口设置为 8 时保持白色 - 使用 4 效果很好。

我现在的问题是我找不到从程序中检查当前像素格式设置是否有效的方法。对于如何处理这些情况,我将不胜感激。

4

1 回答 1

0

直接取自 WGL 规范:

“如果没有找到匹配的格式,则 nNumFormats 设置为零并且函数返回 TRUE。”

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

附带说明一下,我什至不再费心使用窗口系统在我的软件中设置多重采样——使用帧缓冲区对象要方便得多,您可以动态更改抗锯齿,而无需创建一个新的渲染上下文。

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

您可能需要执行多个像素格式查询,然后才能确定任何给定主机支持的所有 MSAA 样本计数。FBO肯定更方便:)

于 2013-05-26T22:06:21.200 回答