我正在尝试使用开放的GLES 3.0 API(随附的Core 330 GLSL着色器语言(在Swift游乐场中。我的顶点着色器的顶部有以下声明:
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
即可获取glEnableVertexAttribArray
和glVertexAttribPointer
调用的属性索引。这些电话仍然是必要的。
着色器声明还不够,因为您仍然需要提供glVertexAttribPointer
参数中的信息,例如归一化,数据类型等