为 Qt5 指定 OpenGL Desktop 而不是 ES

Specifying OpenGL Desktop instead of ES for Qt5

我终于尝试使用我发现的 tutorial 围绕着色器。我决定从 Qt5 (Windows) 开始,因为我对它很熟悉并且可以专注于学习 GLSL 本身。我正在做的事情和教程之间的唯一区别是我正在使用 QOpenGLWidget 而不是 QOpenGLWindow (我只有一个带有一个小部件的表单,没什么特别的)。

为了开始使用片段着色器,我在 Qt 中向我的项目添加了一个新的桌面(不是 ES)片段着色器,Qt 生成了以下着色器:

uniform sampler2D qt_Texture0;
varying vec4 qt_TexCoord0;

void main(void)
{
    gl_FragColor = texture2D(qt_Texture0, qt_TexCoord0.st);
}

然而,编译这个着色器时,它产生了这个错误:

QOpenGLShader::compile(Fragment): ERROR: 0:2: '' : No precision specified for (float)

我做了一些搜索,发现 其中指出:

No default precision exists for fp types in fragment shaders in OpenGL ES 2.0.

据此,我的结论是我的应用程序使用的是 OpenGL ES 而不是 Desktop(否则它不会期望定义精度)。

我看到的 GL 版本字符串是 OpenGL ES 2.0 (ANGLE 2.1.0.8613f4946861)。 Fwiw,在同一台机器上的 Qt4 中,版本字符串是 3.0.0 - Build 9.17.10.4229.

假设我的结论是正确的,我的问题是:如何配置应用程序以使用常规 OpenGL 而不是 OpenGL ES?


评论中将表面格式的可呈现类型设置为 OpenGL 的建议似乎很有希望,但它不起作用。例如,如果我在小部件的构造函数中更改它:

View::View (QWidget *parent) :
    QOpenGLWidget(parent),
    ...
{

    QSurfaceFormat f = format();
    qDebug() << "type was" << f.renderableType();

    f.setRenderableType(QSurfaceFormat::OpenGL);
    qDebug() << "type set to" << f.renderableType();

    setFormat(f);
    qDebug() << "type is now" << format().renderableType();

}

void View::initializeGL () {

    qDebug() << __FUNCTION__ << "type is now" << this->format().renderableType();
    ...

}

问题仍然存在,输出为 (0 = default, 1 = OpenGL, 2 = OpenGLES):

type was 0
type set to 1
type is now 1
initializeGL type is now 2

所以它似乎在构造函数和 initializeGL 之间的某个时刻被强制返回到 OpenGLES

我在构造任何 GUI 对象之前(以及构造 QApplication 之前)设置默认表面格式时也观察到了类似的行为。

Qt5 on Windows 如果视频卡被列入黑名单(在编译 Qt 时在 ANGLE 配置中)或者视频驱动程序没有支持现代 OpenGL(即如果您只有 Microsoft 提供的库存驱动程序)。

您可以强制应用程序使用 OpenGL 而不是角度,方法是添加:

QCoreApplication::setAttribute(Qt::AA_UseDesktopOpenGL);

在您的 main.cpp 文件中或通过将环境变量 QT_OPENGL 设置为 "desktop"(不带引号)。您可以在此处找到更多详细信息:http://doc.qt.io/qt-5/windows-requirements.html