我试图用兼容性配置文件从http://www.kdab.com/opengl-in-qt-5-1-part-5/编译Tesselation的示例(包括源代码),它根本无法加载这个概要文件:
我所做的小的(也是唯一的)修改:
@terraintellationscene.h:
QOpenGLFunctions_4_3_Compatibility* m_funcs;@terraintessellationscene.cpp:
m_funcs = m_context->versionFunctions<QOpenGLFunctions_4_3_Compatibility>();
if ( !m_funcs )
{
qFatal("Requires OpenGL >= 4.0");
exit( 1 );
}
m_funcs->initializeOpenGLFunctions();当我调用versionFunctions()时,它就会崩溃。而且它应该能工作。我可以使用任何compile桌面配置文件编译这个源代码和其他几个具有不同复杂性的不同项目。稍后我将尝试使用GLEW,看看这个问题是否与QT有关,还是与我使用QT或opengl驱动程序有关。
我用的是持续AMD的14.4 WHQL。我尝试使用预构建的5.3源代码和我自己编译的5.3静态版本。我已经尝试了两个老AMD驱动程序,看看这是否是一个问题,与OpenGL提供的软件包,但它失败了。我真的很想使用versionFunctions。
更新2
QOpenGLContext create()在正确设置QSurfaceFormat (QOpenGLContext::setFormat( format ) )之后,似乎完全拒绝了兼容性设置(format.setProfile( QSurfaceFormat::CompatibilityProfile) ),而是创建了一个核心配置文件上下文,完全忽略了我对兼容上下文的请求,但作为一个成功的操作返回了true,该操作不能遵循QSurfaceFormat格式规则。
更新3
嗯,我刚刚发现了这个问题,它与我的修改无关,它在kdab的原始代码中:
// Create an OpenGL context
m_context = new QOpenGLContext;
m_context->setFormat( format );
m_context->create();通过在setFormat之前创建上下文,我能够正确地启动一个适当的兼容性上下文,因为QT只是设置了与setProfile相关的部分设置( QSurfaceFormat::CoreProfile)
更新4:最终解决方案
“在setFormat()之前创建上下文是错误的,并且是偶然的,因为您所请求的是一个普通的OpenGL 2.0上下文,并且驱动程序很可能为您提供了4.3兼容性。在其他驱动程序或平台上,这可能会失败,所以要小心。您所看到的行为是由AMD驱动程序引起的:它拒绝创建适当的兼容性配置文件上下文,除非前向兼容性集没有设置。Qt默认设置fwdcompat位,可以通过在DeprecatedFunctions上设置QSurfaceFormat选项来关闭它。因此,要求与DeprecatedFunctions兼容将提供您想要的东西。其他供应商的驱动程序没有这个问题,没有设置DeprecatedFunctions (即设置前向兼容性)对于兼容性配置文件来说,这是应该忽略的。“通过agocs @ qt devnet
发布于 2014-05-21 12:15:28
您正在获取核心配置文件(感谢Qt),而您需要兼容性配置文件。
您应该在初始化时请求兼容性配置文件,方法是设置格式如下
window.cpp第24行
format.setProfile( QSurfaceFormat::CompatibilityProfile);并且只在创建上下文之后调用versionFunctions。
https://stackoverflow.com/questions/23779357
复制相似问题