我正在尝试在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
?
答案 0 :(得分:1)
layout(location=0)
表示您无需致电glGetVertexAttribLocation
获取glEnableVertexAttribArray
和glVertexAttribPointer
来电的属性索引。那些电话仍然是必要的。
着色器声明是不够的,因为您仍然需要提供glVertexAttribPointer
参数中的信息,如规范化,数据类型等。