我在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/

10-11 16:35