Graphics OpenGLES 3.0中的布局限定符

Graphics OpenGLES 3.0中的布局限定符,graphics,opengl-es,glsl,opengl-es-2.0,swift-playground,Graphics,Opengl Es,Glsl,Opengl Es 2.0,Swift Playground,我正在Swift游乐场中试验使用OpenGLES 3.0API和附带的Core330GLSL着色器语言。我的顶点着色器顶部有以下声明: vec4 a_位置中的layoutlocation=0 我对布局限定符的理解是,它指定了一个_位置在顶点缓冲区对象的属性索引中的位置。虽然我对VAO的理解很松散 但我的三角形不会渲染,除非我还包含以下代码: glEnableVertexAttribArray(0) glVertexAttribPointer( 0, 3,

我正在Swift游乐场中试验使用OpenGLES 3.0API和附带的Core330GLSL着色器语言。我的顶点着色器顶部有以下声明:

vec4 a_位置中的layoutlocation=0

我对布局限定符的理解是,它指定了一个_位置在顶点缓冲区对象的属性索引中的位置。虽然我对VAO的理解很松散

但我的三角形不会渲染,除非我还包含以下代码:

glEnableVertexAttribArray(0)
glVertexAttribPointer(
        0,
        3,
        GLenum(GL_FLOAT),
        GLboolean(GL_FALSE),
        GLsizei(MemoryLayout<Vertex>.size),
        BUFFER_OFFSET(0))
但我对布局限定符的理解表明,这是不必要的,因为它已经在指定顶点属性数组中的位置。在索引0处

因此,要么我遗漏了一些小细节,要么我对如何在GPU上的着色器中访问VAO数据的理解有缺陷。可能两者都有。那么,为什么带有布局限定符的着色器声明不足以将我的顶点位置设置为一个位置呢?

layoutlocation=0意味着您不必调用glGetVertexAttributeLocation来获取GlenableVertexAttributeArray和glVertexAttributePointer调用的属性索引。这些电话仍然是必要的


着色器声明是不够的,因为您仍然需要提供GLVertexAttributePointer参数中的信息,如归一化、数据类型等。

所以您仍然取消了启用调用?不确定这是在启用什么。。您需要输入glVertexAttributePointer参数信息,因为着色器变量如何知道大小/步幅/类型信息?我想知道仅仅在布局中指定一个索引就可以提供足够的信息。。但基本上,如果您说layoutlocation=1,您可以可靠地启用索引1并为索引1设置attribPointer信息?@AlexBollbach如果未启用属性glEnableVertexAttribArray,则在渲染期间将不会使用它。是的,layoutlocation=1意味着您可以在GLVertexAttributePointer中将索引可靠地设置为1。