我在以下平台上遇到了片段着色器的编译错误。
macOS 10.11.6
4.1 INTEL-10.14.74
我的具体错误输出是:
QOpenGLShader::compile(Fragment): ERROR: 0:1: '' : #version required and missing.
接下来是:
ERROR: 0:2: ':' : syntax error: syntax error
*** Problematic Fragment shader source code ***
#define lowp
#define mediump
#define highp
#line 1
:/shaders/fragshader.glsl
我首先会显示我当前的片段着色器代码,然后解释我为解决此问题而尝试做的事情。
#version 330 core
// Import: The vertex color to be rendered.
in vec3 vertexColor;
// Export: Fragment shader color (RGBA).
out vec4 fColor;
void main () {
// Compute the color as a function of the transformed normal vector.
fColor = vec4(normalize(vertexColor) * 0.5 + 0.5, 1.0);
}
我发现了以下SO帖子并尝试了以下解决方案:
1 :我在fangda's solution for similar issue这个问题上尝试了Qt5 OpenGL GLSL version error。
QSurfaceFormat glFormat;
glFormat.setVersion(3, 3);
glFormat.setProfile(QSurfaceFormat::CoreProfile);
QSurfaceFormat::setDefaultFormat(glFormat);
这已添加到我的main.cpp
,但没有改变任何错误。
2 :我发现此问题为Rodrigo Hernandez's answer Serious rendering issues with OpenGL 4.1 and Qt 5
我在您的错误报告中添加了一些评论并对其进行了投票。确实是 一个Qt错误,如下所述: https://www.opengl.org/wiki/Core_Language_%28GLSL%29#Version第一个 预处理器指令应该是#version,但是Qt添加了定义 lowp,mediump和highp自己打破了这个要求。 Nvidia公司 驱动程序让你逃脱它,但英特尔没有(我不知道 关于ATI,所以也许负责的开发人员没有测试 不同的硬件配置。
实际上,没有简单的解决方法,您可以更改Qt代码 不要添加那些定义(这是一个分配噩梦),或不 使用QOpenGLShader类,这意味着保持原始OpenGL 反对自己。
但是,我不知道如何更改Qt代码以不添加这些定义"如果它是预处理器任务。这似乎也非常极端。
3 :我发现这个完美的问题Qt with QOpenGLWidget Core Profile: Lots of shader compiling errors完全符合我的问题......
但是没有人写过答案。所以我再一次不确定如何解决这个问题。
Hernandez的链接清楚地表明错误很可能是因为符号常量被插入到我的#version
行之前,这是不允许的:
除了空格和注释外,#version指令必须出现在着色器中的任何其他内容之前。如果#version指令没有出现在顶部,那么它假定为1.10,这几乎肯定不是你想要的。
不幸的是,我根本不知道如何强制我用Qt安装OpenGL来不插入那些符号常量。