我终于尝试使用着色器来理解着色器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)
我做了一些搜索并发现这个答案其中指出:
OpenGL ES 2.0 中片段着色器中的 fp 类型不存在默认精度。
由此,我的结论是我的应用程序使用的是 OpenGL ES 而不是桌面(否则它不会期望定义精度)。
我看到的 GL 版本字符串是OpenGL ES 2.0(角度2.1.0.8613f4946861)。 Fwiw,在同一台机器上的 Qt4 中,版本字符串是3.0.0 - 内部版本 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
)也是如此。