3

我已经看到了一些关于能够在现代 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 下运行该应用程序。还有其他方法吗?

4

2 回答 2

6

我在您的错误报告中添加了一些评论并投了赞成票。这确实是一个 Qt 错误,如此处所述:https : //www.opengl.org/wiki/Core_Language_%28GLSL%29#Version 第一个预处理器指令应该是#version,但 Qt 添加了对 lowp、mediump 和 highp 的定义它自己打破了这个要求。Nvidia 驱动程序可以让您侥幸逃脱,但 Intel 的驱动程序不能(我不知道 ATI 的驱动程序),因此负责的开发人员可能没有在足够多的不同硬件配置上进行测试。

事实上,没有简单的解决方法,您可以更改 Qt 代码以不添加这些定义(这是分发的噩梦),或者不使用 QOpenGLShader 类,这意味着您自己保留原始 OpenGL 对象。

于 2015-02-07T04:09:06.267 回答
1

我不同意它是 Qt 中的一个错误。如您粘贴的链接中所述:“如果 #version​ 指令未出现在顶部,则它假定为 1.10,这几乎肯定不是您想要的。”

这就是 Qt 想要的,也是 OpenGL4 上下文应该提供/允许的。这是英特尔驱动程序中的一个错误:当您想要 >2.0 上下文时,隐式回退到版本 GLSL1.10 不适用于英特尔驱动程序

于 2015-11-04T12:40:31.203 回答