WGL:没有双缓冲+多次采样=失败?

时间:2009-10-18 00:40:01

标签: opengl doublebuffered frame-rate multisampling wgl

我通常使用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(这款笔记本电脑液晶显示器的工作频率为60Hz)。但是通过双缓冲关闭,我可以达到1500 FPS。有没有办法通过双缓冲来实现这个目标?

1 个答案:

答案 0 :(得分:9)

理论上,在单缓冲模式下绘制意味着您将直接修改呈现给屏幕的内容(也称为前缓冲区)。 由于该内存已经是特定格式,因此您无法选择其他内存。 (我在理论上说 ,因为该平台确实在实践中取悦它。例如Aero不允许访问前缓冲区。)

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

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

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

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

相关问题