c++ - 为 Qt5 指定 OpenGL 桌面而不是 ES
问题描述
我终于尝试使用我找到的教程来了解着色器。我决定从 Qt5 (Windows) 开始,因为我对它很熟悉,并且可以专注于学习 GLSL 本身。我正在做的和本教程之间的唯一区别是我正在使用 aQOpenGLWidget
而不是 a 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 而不是 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
.
解决方案
如果显卡被列入黑名单(在编译 Qt 时处于 ANGLE 配置中)或视频驱动程序不支持现代 OpenGL(即,如果您只有微软提供的股票驱动程序)。
您可以通过添加以下内容来强制应用程序使用 OpenGL 而不是角度:
QCoreApplication::setAttribute(Qt::AA_UseDesktopOpenGL);
在您的 main.cpp 文件中或通过将环境变量QT_OPENGL设置为“桌面”(不带引号)。您可以在此处找到更多详细信息:http: //doc.qt.io/qt-5/windows-requirements.html
推荐阅读
- c++ - 关于递增迭代器的困惑
- python - PermissionError:[WinError 5] 访问被拒绝:'C:\\Users\\testuser'
- google-sheets - 是否可以使用公式和云端硬盘文件路径将图像插入 Google 表格电子表格?
- apache-kafka - kafka connect不加载手动构建的连接器
- vb.net - 尝试在代码中访问映射驱动器时如何解决“找不到路径的一部分”
- postgresql - 在 postgres 中运行 sql 文件时出错 | 没有这样的文件或目录
- javascript - 使用 vanilla JavaScript 从 DOM 和本地存储中删除输入
- javascript - 让变量发出
- triggers - 顶点中的映射检索子引用查找值获取空值
- java - 具有局部变量加载 bean 的类的 Junit