Open GLES 3.0 中的布局限定符

Layout Qualifiers in Open GLES 3.0

我正在 Swift Playground 中尝试使用 Open GLES 3.0 API(以及随附的核心 330 GLSL 着色器语言)。我的顶点着色器顶部有以下声明:

layout(location = 0) in vec4 a_Position;

我对布局限定符的理解是指定 a_Position 在顶点缓冲区对象的属性索引中的位置。 (我对 VAO 的理解是松散的..)。

但是除非我还包含以下代码,否则我的三角形不会呈现:

glEnableVertexAttribArray(0)
glVertexAttribPointer(
        0,
        3,
        GLenum(GL_FLOAT),
        GLboolean(GL_FALSE),
        GLsizei(MemoryLayout<Vertex>.size),
        BUFFER_OFFSET(0))

但是根据我对布局限定符的理解,我认为这不是必需的,因为它已经指定了 a_Position 在顶点属性数组中的位置。 (在索引 0)。

因此,要么是我遗漏了一些小细节,要么是我对 GPU 上的着色器如何访问 VAO 数据的理解存在缺陷。可能两者兼而有之。那么为什么带有布局限定符的着色器声明不足以让我的顶点位置进入 a_Position

layout(location=0) 意味着您不必调用 glGetVertexAttribLocation 来获取 glEnableVertexAttribArrayglVertexAttribPointer 调用的属性索引。这些电话仍然是必要的。

着色器声明是不够的,因为您仍然需要提供 glVertexAttribPointer 参数中的信息,例如规范化、数据类型等