繁体   English   中英

为 Qt5 指定 OpenGL 桌面而不是 ES

[英]Specifying OpenGL Desktop instead of ES for Qt5

我终于尝试使用我找到的教程围绕着色器。 我决定从 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 提供的库存驱动程序)。

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

QCoreApplication::setAttribute(Qt::AA_UseDesktopOpenGL);

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM