顶点着色器

修改顶点着色器,去掉代码中包含的硬编码顶点数据。使用in关键字使用顶点缓冲中的顶点数据:

#version 450
#extension GL_ARB_separate_shader_objects : enable

layout(location = 0) in vec2 inPosition;
layout(location = 1) in vec3 inColor;

layout(location = 0) out vec3 fragColor;

out gl_PerVertex {
    vec4 gl_Position;
};

void main() {
    gl_Position = vec4(inPosition, 0.0, 1.0);
    fragColor = inColor;
}

上面代码中的inPosition和inColor变量是顶点属性。它们代表了顶点缓冲中的每个顶点数据,就跟我们使用数组定义的顶点数据是一样的。重新编译顶点着色器,保证没有出现问题。

layout(location = x)用于指定变量在顶点数据中的索引。特别需要注意,对于64位变量,比如dvec3类型的变量,它占用了不止一个索引位置,我们在定义这种类型的顶点属性变量之后的顶点变量,要注意索引号的增加并不是1:

layout(location = 0) in dvec3 inPosition;
layout(location = 2) in vec3 inColor;

读者可以查阅OpenGL的官方文档获得关于layout修饰符的更多信息。