QOpenGlShader:#Version是否必需且缺失?

时间:2018-03-02 23:38:05

标签: c++ qt opengl fragment-shader

问题

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

  • 操作系统macOS 10.11.6
  • 打开GL 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来不插入那些符号常量。

0 个答案:

没有答案