opengl - WGL:没有双缓冲 + 多重采样 = 失败?

标签 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(这台笔记本电脑 LCD 工作在 60Hz)。但关闭双缓冲后,我可以获得高达 1500 FPS 的帧率。有没有办法通过双缓冲来实现这一点?

最佳答案

理论上,在单缓冲区模式下绘图意味着您直接修改屏幕上呈现的内容(也称为前缓冲区)。 由于该内存已经采用特定格式,因此您无法选择其他格式。 (我说的是理论上,因为平台在实践中会按照自己的意愿行事。例如,Aero 不允许访问前缓冲区)。

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

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

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

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

关于opengl - WGL:没有双缓冲 + 多重采样 = 失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1583611/

相关文章:

c++ - 离屏渲染(使用 FBO 和 RenderBuffer)以及颜色、深度、模板的像素传输

c++ - QQuickView 上未触发触摸事件

java - awt双缓冲

c++ - 在 win32 中绘制像素最快的方法是什么

image-processing - ffmpeg 忽略每个帧率选项,将结果锁定为 25 fps

iphone - 从头开始使用 Unity3D 或 UDK 或 OPENGL?

c++ - 无法在 OpenGL 中随时间改变颜色

DirectX 视频闪烁

c++ - 如何在OpenGL中更新 "forward"运动

java - 使用 JavaFX 调节每秒执行次数