为 Qt5 指定 OpenGL Desktop 而不是 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提供的常用驱动程序),则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
- OpenGL ES 2.0将纹理绘制到屏幕上是行不通的
- SDL + OpenGL ES 2.0 使用着色器显示纹理
- 为什么OpenGL ES 3.1+上GL_DEPTH_COMPONENT的glCheckFramebufferStatu
- 计算着色器Open GL ES的多个输入
- Open GL ES 3.1 的计算着色器的最小工作示例
- OpenGL ES 绘制形状
- 如何使用着色器在 opengl es 中渲染四边形内部的部分纹理
- 错误:不支持 GLSL 3.30.支持的版本包括:1.10、1.20、1.30、1.00 ES、3.00 ES、3.10
- OpenGL ES:在顶点着色器中计算顶点位置时性能不佳
- C++ GLSL 着色器:"error: GLSL 3.30 is not supported. Supported versions are: 1.10, 1.20, 1.30, 1.00 ES,
- OpenGL (ES) 图像处理C++
- E/libEGL:调用没有当前上下文的 OpenGL ES API (每个线程记录一次) - Android/SDL
- AcquireNextFrame 不起作用(Desktop Replication API & D3D11)
- 使用GlblitFrameBuffer进行多样采样,无法使用OpenGL ES 3.0
- 在使用PI上的OpenGL ES绘制之前,如何旋转纹理
- 使用Emscripten将OpenGL ES转换回主机
- Opensl Es-eSunipuling Audio缓冲区队列
- OpenGL ES ANDROID C++ ERROR
- 为 Qt5 指定 OpenGL Desktop 而不是 ES
- 如何检测opengl是否在Desktop或ES上运行