激活多重采样(Windows)时如何防止空的OpenGL窗口?

Posted

技术标签:

【中文标题】激活多重采样(Windows)时如何防止空的OpenGL窗口?【英文标题】:How can i prevent an empty OpenGL Window when activating multisampling (Windows)? 【发布时间】:2013-05-26 17:29:40 【问题描述】:

我正在使用 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 效果很好。

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

【问题讨论】:

【参考方案1】:

直接取自 WGL 规范:

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

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

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

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

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

【讨论】:

非常感谢您指出这一点。它就在我的眼皮底下。。当我可以腾出一些时间时,我将尝试使用帧缓冲区对象。

以上是关于激活多重采样(Windows)时如何防止空的OpenGL窗口?的主要内容,如果未能解决你的问题,请参考以下文章

在 OpenGL Win32 上激活多重采样

如何在 MTKView 中使用多重采样?

将OpenGL帧缓冲区对象与Qt(QOpenGLWidget)一起使用,绘制到帧缓冲区时如何禁用多重采样

ImGui 多重采样

为啥在使用 FBO 进行多重采样时,OpenGL 会使我的场景变亮?

在 GLFW 窗口中启用多重采样不会提高抗锯齿的质量