我看到了一些关于能够在现代OpenGL上运行Qt5的有前景的参考资料。我正在使用以下代码将我的QQuickView设置为OpenGL 4.1 Core(我的MacBook在OSX 10.9上支持的最新版本)。
QSurfaceFormat sf = g_mainView->format();
sf.setProfile(QSurfaceFormat::CoreProfile);
sf.setVersion(4, 1);
g_mainView->setFormat(sf);
重大问题。首先,应用程序在尝试渲染文本时完全崩溃。如果我碰巧在QML中只有图像、矩形等,我会得到大量的碎片着色器错误。
QOpenGLShader::compile(Fragment): ERROR: 0:1: '' : #version required and missing.
ERROR: 0:5: 'varying' : syntax error syntax error
*** Problematic Fragment shader source code ***
#define lowp
#define mediump
#define highp
varying highp vec2 qt_TexCoord0;
uniform highp float qt_Opacity;
uniform lowp sampler2D source;
uniform lowp sampler2D maskSource;
void main(void) {
gl_FragColor = texture2D(source, qt_TexCoord0.st) * (texture2D(maskSource, qt_TexCoord0.st).a) * qt_Opacity;
}
***
QQuickCustomMaterialShader: Shader compilation failed:
"ERROR: 0:1: '' : #version required and missing.
ERROR: 0:5: 'varying' : syntax error syntax error
"
Qt5.3还没有为现代OpenGL做好准备吗?还是我只是设置错误?我想使用OpenGL 4嵌入我自己的OpenGL图形窗口,所以我的假设是,我也需要在GL 4下运行该应用程序。还有别的办法吗?
我在您的错误报告中添加了一些注释并进行了投票。这确实是一个Qt错误,如下所述:https://www.opengl.org/wiki/Core_Language_%28GLSL%29#Version第一个预处理器指令应该是#version,但Qt自己添加了lowp、medium和highp的定义,打破了这一要求。Nvidia驱动程序可以让你逃脱惩罚,但英特尔没有(我不知道ATI的),所以可能负责的开发人员没有测试足够不同的硬件配置。
事实上,没有简单的解决方法,您可以更改Qt代码,不添加这些定义(这是一个分发噩梦),或者不使用QOpenGLShader类,这意味着自己保存原始OpenGL对象。
我不同意它是Qt中的一个bug。如您粘贴的链接中所述:"如果是#版本指令并没有出现在顶部,然后它假定为1.10,这几乎肯定不是您想要的。"
这正是Qt想要的,也是OpenGL4上下文应该提供/允许的。这是英特尔驱动程序中的一个错误:当您想要一个>2.0上下文时,GLSL1.10版本的隐式回退不适用于英特尔驱动程序