QOpenGLShader语言 - 版本指令必须是第一个语句,并且不能重复

QOpenGLShader - version directive must be first statement and may not be repeated

本文关键字:语句 不能 第一个 语言 版本 指令 QOpenGLShader      更新时间:2023-10-16

我正在使用Qt 5.11.2构建一个OpenGL应用程序。添加曲面细分着色器时,会发生以下错误:

QOpenGLShader::编译(细分控制): 0(2):错误 C0204:版本指令必须是第一个语句,不能重复

*** Problematic Tessellation Control shader source code ***
#define lowp
#define mediump
#define highp
#line 1
´╗┐#version 400
#line 1
layout (vertices = 4) out;

我正在使用 Geforce GTX 1050/PCIe/SSE2 GPU 在 Windows 10 上工作。

找到了类似的报告,但没有一个答案对我有用:Nvidia驱动程序更新后无法在Qt 5.3上编译GLSL着色器

OpenGL 4.1 和 Qt 5 的严重渲染问题

着色器如下所示:

#version 400
layout (vertices = 4) out;
uniform float animationFrame;
in vec3 v_vertex[];
out vec3 tc_vertex[];
void main()
{...}

要添加着色器,我使用以下代码:

addShader(QOpenGLShader::Vertex, "data/cube.vert", *m_program);
addShader(QOpenGLShader::Fragment, "data/cube.frag", *m_program);
addShader(QOpenGLShader::TessellationControl, "data/cube.tcs", *m_program);
addShader(QOpenGLShader::TessellationEvaluation, "data/cube.tes", *m_program);
addShader(QOpenGLShader::Geometry, "data/cube.geom", *m_program);

显然,Qt插入的第一行会产生错误。有什么想法可以解决这个问题吗?

我有同样的问题,我的错误如下所示:

QOpenGLShader::compile(Fragment): 0(2) : error C0204: version directive must be first statement and may not be repeated
*** Problematic Fragment shader source code ***
#ifdef GL_KHR_blend_equation_advanced
#extension GL_ARB_fragment_coord_conventions : enable
#extension GL_KHR_blend_equation_advanced : enable
#endif
#define lowp
#define mediump
#define highp
#line 1
???#version 330 core
out vec4 FragColor;
void main(void)
{
    FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);
}
***

如您所见,消息中有???,而您有´╗┐

当我从"带有BOM的UTF-8"更改为"UTF-8"时,它可以工作~

我有这样的错误:

???#version 330 core

我使用可视化代码将文件编码从"带有 BOM 的 utf-8"更改为"utf-8"。然后它起作用了。

我想答案是"版本指令必须是第一个语句,不能重复"

因此,将您的版本指令放在第一行 - 在所有定义之前并且相同。刚刚检查了它 - 就是这样。当我在代码的第四行中输入指令"#version 330 core"时 - 发生了相同的错误"版本指令必须是第一个语句,并且不能重复";所以正确的方法是把这个指令放在第一行,因为它应该是:

1 #version 330 core
2 in highp vec3 vert;
3 in highp vec3 vertNormal;

其中 1,2,3 - 行的数字。