我在Unix 19.04操作系统中使用带有GLSL的opengl 4.4和3.3的Qt 5.13。
请注意,我使用QOpenGLWindow作为Qt应用程序的主窗口。
我正在尝试正确链接opengl顶点着色器的输入。我尝试了以下两种方法:
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
}
在尝试编译所有这些之后,我从信息日志中得到了以下错误:
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 vec3 vs_position;
out vec3 vs_color;
out vec2 vs_texcoord;
注意,错误消息
0:5(16)
中的0:5(16): error: syntax error, unexpected ';', expecting '{'.
。表示第5行和第16个符号。第5行的第16个符号是分号(
;
),这是意外的,因为out vs_position
不是有效的声明。关于c++ - 无法设置顶点着色器中输入的位置,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57536998/