我在 Unix 19.04 操作系统中使用 Qt 5.13 以及 opengl 4.4 和 3.3 进行 GLSL。
请注意,我使用 QOpenGLWindow 作为 Qt 应用程序的主窗口。
我正在尝试正确链接 opengl vertex-shader 的输入。我尝试了这两种方法:
1.使用GLSL中的“location”关键字,我编写了这个顶点着色器,但在尝试编译这个顶点着色器时仍然遇到问题:
#version 330 core\n
layout (location = 0) in vec3 vertex_position;\n
layout (location = 1) in vec3 vertex_color;\n
layout (location = 2) in vec2 vertex_texcoord;\n
out vs_position;\n
out vs_color;\n
out vs_texcoord;\n
void main() {\n
vs_position = vertex_position;\n
vs_color = vertex_color;\n
vs_texcoord = vec2(vertex_texcoord.x, vertex_texcoord.y*-1.0f);\n
gl_Position = vec4(vertex_position, 1.0f);\n
}
尝试编译所有这些后,我从信息日志中收到此错误:
0:5(16): error: syntax error, unexpected ';', expecting '{'.
2-我尝试的另一种尝试是使用“attribute”关键字,
相同的代码,但编辑以“layout”一词开头的三行:
attribute vec3 vertex_position;\n
attribute vec3 vertex_color;\n
attribute vec2 vertex_texcoord;\n
之后,我使用 glBindAttribLocation() 将属性与其位置绑定(bind):
...
m_functions->glBindAttribLocation(vertex_shader, 0, "vertex_position");
m_functions->glBindAttribLocation(vertex_shader, 1, "vertex_color");
m_functions->glBindAttribLocation(vertex_shader, 2, "vertex_texcoord");
m_functions->glAttachShader(shader_program, vertex_shader);
m_functions->glLinkProgram(shader_program);
...
(其中 m_functions 是:
initializeGL() {
m_functions = context->functions();
...}
)
仍然遇到同样的错误!
我尝试了上面提到的方法,但这两种方法都不适合我!
我使用的是传统方式(以gl...开头的函数),没有使用Qt中提供的类!
最佳答案
该错误与布局位置限定符或顶点着色器输入变量各自的属性无关。
但顶点着色器输出变量的声明中缺少类型规范:
out vs_position; out vs_color; out vs_texcoord;
它必须是:
out vec3 vs_position;
out vec3 vs_color;
out vec2 vs_texcoord;
请注意,错误消息中的 0:5(16)
0:5(16): error: 语法错误,意外的 ';',期望 '{'。
。表示第 5 行和第 16 个符号。
第 5 行中的第 16 个符号是分号 (;
),这是意外的,因为 out vs_position
不是有效的声明。
关于c++ - 无法设置顶点着色器中的输入位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57536998/