QOpenGLShader语言 - 版本指令必须是第一个语句,并且不能重复
QOpenGLShader - version directive must be first statement and may not be repeated
我正在使用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 - 行的数字。
相关文章:
- 不能在 if 语句 - c++ 中使用 void func 直接将字符串转换为大写
- 变量不能在 lambda 中隐式捕获,并且没有使用 switch 语句指定捕获默认值
- 为什么我不能在我的三元表达式中使用 return,但我可以在常规的 if-else 语句中使用?
- 为什么我不能比较 IF 语句中的三个不同值?.CPP
- QOpenGLShader语言 - 版本指令必须是第一个语句,并且不能重复
- 为什么您可以在 switch 语句中的"默认"下定义变量,而不能在"case"下定义变量
- 为什么我不能在 If 语句中定义多个变量以相互相等?
- 不能在if语句之外访问c++结构
- 不能返回 if 语句的右边
- 为什么我不能在C++的三元条件语句中使用 "break" 语句?
- 若语句不起作用,我希望它能起作用
- 为什么我的 switch 语句不能移动到下一个案例?
- while 循环不能有两个 CIN 语句吗?
- 为什么开关大小写语句中不能有变量?
- 为什么自动类型不能与c++语句中的其他内置类型共存
- 为什么语句不能出现在命名空间范围内
- 语句调用构造函数,但对构造函数不做任何操作——为什么它不能编译
- 为什么c++中的if语句不能处理多个条件
- 为什么不能在 return 语句中使用 "<<" 运算符?
- range -for语句不能使用数组函数参数构建范围表达式