【问题标题】:WGL: No double buffering + multi sampling = FAIL?WGL:没有双缓冲+多采样=失败?
【发布时间】:2010-12-07 16:53:44
【问题描述】:

我通常使用wglChoosePixelFormatARB() 和这些参数(以及其他参数)创建像素格式:

WGL_DOUBLE_BUFFER_ARB = GL_TRUE
WGL_SAMPLE_BUFFERS_ARB = GL_TRUE
WGL_SAMPLES_ARB = 4

即双缓冲和 x4 多重采样。这工作得很好。
但是当我尝试打开双缓冲时:

WGL_DOUBLE_BUFFER_ARB = GL_FALSE
WGL_SAMPLE_BUFFERS_ARB = GL_TRUE
WGL_SAMPLES_ARB = 4

wglChoosePixelFormatARB() 的调用失败(或者说它没有创建任何东西)
当我有效地关闭多重采样时:

WGL_DOUBLE_BUFFER_ARB = GL_FALSE
WGL_SAMPLE_BUFFERS_ARB = GL_TRUE
WGL_SAMPLES_ARB = 1

我又正常工作了。

是否存在阻止非双缓冲像素格式与多重采样一起使用的固有因素​​?

我关闭双缓冲的原因是为了实现不受限制的帧速率。通过双重缓冲,我得到的帧速率最高仅为 60 FPS(这款笔记本电脑 LCD 工作频率为 60Hz)。但是关闭双缓冲后,我可以达到 1500 FPS。有没有办法通过双缓冲来实现这一点?

【问题讨论】:

    标签: opengl doublebuffered frame-rate multisampling wgl


    【解决方案1】:

    理论上,在单缓冲区模式下绘图意味着您正在直接修改呈现在屏幕上的内容(也称为前端缓冲区)。 由于该内存已采用特定格式,因此您无需选择另一种格式。 (我说理论上是因为该平台在实践中可以满足它。例如,Aero 不允许访问前端缓冲区)。

    此外,在进行多重采样时,将 X 个样本/像素转换为 1 个像素以进行绘图的步骤是在将后缓冲区复制到前缓冲区时(称为解析步骤)。在单缓冲模式下,没有这个步骤。

    至于您的 60 fps 锁定,您可能需要查看WGL_EXT_swap_control。这里的问题是您通常不想在屏幕刷新数据时更新屏幕上显示的内容;它会造成撕裂。因此,默认情况下,Swap 仅在屏幕垂直同步(也称为 vsync)时更新,因此您最终会锁定屏幕的刷新率。

    如果您不介意显示器显示不同帧的部分,您可以将其关闭。

    为了完整起见,还有一种称为三重缓冲的替代模式,它本质上是在显示前缓冲区的同时在两个后缓冲区之间进行 GPU 乒乓渲染。当需要更改屏幕上显示的内容 (vsync) 时,由 gpu 选择最后一个完成的后备缓冲区。遗憾的是,我不知道要求三重缓冲的 WGL 方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多