为Qt5指定OpenGL桌面而不是ES

问题描述 投票:1回答:1

我终于试图用我发现的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)

我做了一些搜索,发现this answer说:

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

由此,我的结论是我的应用程序使用的是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 =默认值,1 = OpenGL,2 = OpenGLES):

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

所以它似乎被迫在构造函数和OpenGLES之间的某个点上回到initializeGL

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

c++ opengl opengl-es qt5 fragment-shader
1个回答
1
投票

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

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

QCoreApplication::setAttribute(Qt::AA_UseDesktopOpenGL);

在main.cpp文件中或通过将环境变量QT_OPENGL设置为“desktop”(不带引号)。你可以在这里找到更多细节:http://doc.qt.io/qt-5/windows-requirements.html

© www.soinside.com 2019 - 2024. All rights reserved.