C++ QOpenGlShader:#需要版本,但缺少版本? 问题

C++ QOpenGlShader:#需要版本,但缺少版本? 问题,c++,qt,opengl,fragment-shader,C++,Qt,Opengl,Fragment Shader,在以下平台上,我的片段着色器遇到编译错误 操作系统:macOS 10.11.6 开放式GL:4.1英特尔-10.14.74 我的具体错误输出是: QOpenGLShader::compile(Fragment): ERROR: 0:1: '' : #version required and missing. 随后是: ERROR: 0:2: ':' : syntax error: syntax error *** Problematic Fragment shader source c

在以下平台上,我的片段着色器遇到编译错误

  • 操作系统
    macOS 10.11.6
  • 开放式GL
    4.1英特尔-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
我将首先展示我当前的片段着色器代码,然后解释为了修复这个问题我尝试了什么


片段着色器
尝试的解决方案 我找到了以下SO帖子,并尝试了以下解决方案:

1:我试过这个问题

这已添加到我的
main.cpp
,但没有改变任何错误

2:我发现这个问题

我在你的bug报告中添加了一些评论并投票通过了。的确如此 一个Qt错误,如下所述: 第一 预处理器指令应为#版本,但Qt添加了 lowp、mediump和highp本身就违反了这一要求。英伟达 驱动程序可以让你逍遥法外,但英特尔却不行(我不知道) 关于ATI的),所以负责的开发人员可能没有在 足够不同的硬件配置

事实上,没有简单的解决方法,您可以更改Qt代码 不添加这些定义(这是一个发布噩梦),或者不添加 使用QOpenGLShader类,这意味着保留原始OpenGL 反对你自己

但是,如果是预处理器任务,我不知道如何“更改Qt代码以不添加这些定义”。这似乎也相当极端

3:我找到了一个与我的问题完全匹配的完美问题

但是没有人写过答案。所以我再一次不确定如何解决这个问题


Hernandez的链接清楚地表明,错误可能是由于在my
#version
行之前插入了符号常量造成的,这是不允许的:

除空格和注释外,#version指令必须出现在着色器中的其他任何内容之前。如果#version指令没有出现在顶部,则它假定为1.10,这几乎肯定不是您想要的


不幸的是,我根本不知道如何强制我的OpenGL和Qt安装不插入这些符号常量

你有没有试过“不要使用QOpenGLShader类”?如果这是Qt5中的一个bug,我相信很快就会有更新。因此,第三种选择是坐等更新(至少这是一种“便宜”的解决方案)。(再说一次,我使用Qt OpenGL的经验是它在大多数情况下都会以某种方式被破坏……我最终放弃了Qt)这方面有什么更新吗?我想补充一点,我也看到了这个错误,我很沮丧地说,我可能不得不跳过Qt的抽象,写我自己的。
#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);
}
QSurfaceFormat glFormat;
glFormat.setVersion(3, 3);
glFormat.setProfile(QSurfaceFormat::CoreProfile);
QSurfaceFormat::setDefaultFormat(glFormat);