c++ - 无法设置顶点着色器中的输入位置

标签 c++ qt opengl glsl shader

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

相关文章:

c++ - 当编译器决定填充结构时

c++ - WiFiNINA 获取 JSON 数据时出现问题

c++ - Qt 如何在幕后共享 OpenGL 上下文?

c++ - RAII 和 Qt 信号

c - 在 C 中进行简单绘图和事件捕获的最简单方法是什么?

c++ - 使用 alpha 值渲染纹理(贴花)?

c++ - C表达式的评估

qt - 在两个或多个窗口之间拖放 QDockWidget

java - OpenGL VAO 多个 VBO 绑定(bind)问题

c++ - Windows 应用商店应用程序的扩展 SDK 在远程调试期间不起作用