我终于尝试使用我发现的tutorial将头缠绕在着色器上。我决定从Qt5(Windows)开始,因为我对此很熟悉,并且可以专注于学习GLSL本身。我正在做的事情和本教程之间的唯一区别是,我使用的是QOpenGLWidget
而不是QOpenGLWindow
(我只用一个带有一个小部件的表单,没什么特别的)。 / p>
要开始使用片段着色器,在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)。首先,在同一台计算机上的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
之前),在设置默认表面格式时,我也观察到类似的行为。
答案 0 :(得分:1)
您可以通过添加以下内容来强制应用程序使用OpenGL而不是angle:
QCoreApplication::setAttribute(Qt::AA_UseDesktopOpenGL);
在main.cpp文件中,或者将环境变量 QT_OPENGL 设置为“桌面”(不带引号)。您可以在这里找到更多详细信息:http://doc.qt.io/qt-5/windows-requirements.html