为 Qt5 指定 OpenGL Desktop 而不是 ES

Specifying OpenGL Desktop instead of ES for Qt5

本文关键字:ES Desktop Qt5 指定 OpenGL      更新时间:2023-10-16

我终于尝试使用我找到的教程来了解着色器。我决定从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)

我四处搜索了一下,找到了这个答案,上面写着:

OpenGL ES 2.0 中片段着色器中的 fp 类型不存在默认精度。

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

我看到的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 = 默认值, 1 =OpenGL, 2 =OpenGLES):

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

因此,它似乎在构造函数和initializeGL之间的某个点被迫回到OpenGLES

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

如果视频卡被列入黑名单(在编译Qt时处于ANGLE配置中)或视频驱动程序不支持现代OpenGL(即,如果您只有Microsoft提供的常用驱动程序),则Windows上的Qt5将使用ANGLE作为后备(模拟OpenGL ES 2.0和Direct3D)。

您可以通过添加以下内容来强制应用程序使用 OpenGL 而不是角度:

QCoreApplication::setAttribute(Qt::AA_UseDesktopOpenGL);

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