【问题标题】:Specifying OpenGL Desktop instead of ES for Qt5为 Qt5 指定 OpenGL 桌面而不是 ES
【发布时间】:2019-08-19 08:29:53
【问题描述】:

我终于尝试使用我找到的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 而不是桌面(否则它不会期望定义精度)。

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

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


cmets 中将表面格式的可渲染类型设置为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 之前)设置默认表面格式时,我也观察到了类似的行为。

【问题讨论】:

  • 对于QOpenGLWidget,您可能必须将QSurface::RenderableType 设置为OpenGL
  • @dave 嗯;所以我在创建UI对象之前尝试将它设置为默认表面格式的OpenGL(它最初是DefaultRenderableType),但结果是一样的,而且确实到initializeGL被称为小部件的格式是@ 987654343@ 再次。不过,这似乎是在正确的轨道上。我将对此进行更多调查,并尝试找出它不起作用的原因。
  • 我开始怀疑这是否与我的旧笔记本电脑有关;如果我尝试以表面格式要求 GL 版本 4 或更高版本,则上下文初始化完全失败。
  • 您是否从 Qt 文档中尝试过:在某些平台(例如 macOS)上,当 OpenGL 核心配置文件上下文为请求。 也可能是您的硬件不支持该特定版本的 OpenGL。在这种情况下,您请求的 Surface 格式可能不会相应设置。 (见QOpenGLWidget::format
  • @dave 是的,我是在构建 QApplication 之前完成的。我想这台机器不支持它。您的 cmets 中的所有内容似乎都是有道理的,并且不支持它的结论似乎是合理的,如果您想将其作为答案提出来,我认为有足够的证据表明它在这一点上是正确的。我会看看是否能找到另一种方法来验证这台机器的功能。我没有更新的电脑可以测试。

标签: c++ opengl opengl-es qt5 fragment-shader


【解决方案1】:

如果视频卡被列入黑名单(在 Qt 编译时的 ANGLE 配置中)或视频驱动程序不支持现代 OpenGL(即如果你只有微软提供的股票驱动程序)。

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

QCoreApplication::setAttribute(Qt::AA_UseDesktopOpenGL);

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

【讨论】:

  • 哇哦;这完全奏效了。版本字符串现在是“3.1.0 - Build 9.17.10.4229”;我的着色器编译并运行得很好。太棒了,谢谢!
猜你喜欢
  • 1970-01-01
  • 2018-08-09
  • 2015-04-18
  • 1970-01-01
  • 2014-01-03
  • 1970-01-01
  • 2013-09-30
  • 2011-06-14
  • 1970-01-01
相关资源
最近更新 更多