我将UI中的widet提升为QGlWidget,并在QGLWidget的构造函数中将交换间隔指定为0。
但这不会影响小部件,它仍然将交换间隔的值显示为1。
如何将交换值更改为0。
平台是windows。
GLWidget::GLWidget(QWidget * parent): QGLWidget(parent) {
QGLFormat format;
format.setDepthBufferSize(24);
format.setStencilBufferSize(8);
format.setSampleBuffers(true);
format.setSamples(4);
format.setSwapInterval(0);
this -> setFormat(format);
makeCurrent();
qDebug() << "Swap Interval +++++++ " << this -> format().swapInterval();
}发布于 2021-11-11 11:09:03
我非常确定在Windows中必须有WGL_EXT_swap_control扩展才能正常工作。
发布于 2021-11-12 01:58:25
在Windows上有一个OpenGL扩展方法wglSwapIntervalEXT。来自b2b3 http://www.gamedev.net/community/forums/topic.asp?topic_id=360862的帖子
如果你在Windows上工作,你必须使用扩展来使用
wglSwapIntervalExt函数。它在wglext.h中定义。您还需要下载glext.h文件。在wglext文件中,声明了Windows特定扩展的所有入口点。所有这些函数都以wgl前缀开头。要获取有关所有已发布扩展的更多信息,您可以查看OpenGL扩展注册表。
wglSwapIntervalEXT来自WGL_EXT_swap_control扩展。它允许您在每次缓冲区交换之前指定最小帧数。通常用于垂直同步(如果将交换间隔设置为1)。更多关于整个扩展的信息可以在这里找到。在使用此函数之前,您需要查询您的卡是否支持WGL_EXT_swap_control,然后使用wglGetProcAddress函数获取指向该函数的指针。
要测试对给定扩展的支持,您可以使用如下函数:
#include <windows.h>
#include "wglext.h"
bool WGLExtensionSupported(const char *extension_name)
{
// this is pointer to function which returns pointer to string with list of all wgl extensions
PFNWGLGETEXTENSIONSSTRINGEXTPROC _wglGetExtensionsStringEXT = NULL;
// determine pointer to wglGetExtensionsStringEXT function
_wglGetExtensionsStringEXT = (PFNWGLGETEXTENSIONSSTRINGEXTPROC) wglGetProcAddress("wglGetExtensionsStringEXT");
if (strstr(_wglGetExtensionsStringEXT(), extension_name) == NULL)
{
// string was not found
return false;
}
// extension is supported
return true;
}初始化您需要的函数指针的
:
PFNWGLSWAPINTERVALEXTPROC wglSwapIntervalEXT = NULL;
PFNWGLGETSWAPINTERVALEXTPROC wglGetSwapIntervalEXT = NULL;
if (WGLExtensionSupported("WGL_EXT_swap_control"))
{
// Extension is supported, init pointers.
wglSwapIntervalEXT = (PFNWGLSWAPINTERVALEXTPROC) wglGetProcAddress("wglSwapIntervalEXT");
// this is another function from WGL_EXT_swap_control extension
wglGetSwapIntervalEXT = (PFNWGLGETSWAPINTERVALEXTPROC) wglGetProcAddress("wglGetSwapIntervalEXT");
},然后您可以将这些指针用作任何其他指向函数的指针。要启用vync,可以调用
wglSwapIntervalEXT(1);要禁用vync,可以调用wglSwapIntervalEXT(0)。
要获得当前的交换间隔,需要调用wglGetSwapIntervalEXT().
https://stackoverflow.com/questions/69810129
复制相似问题