[英]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
即可获取glEnableVertexAttribArray
和glVertexAttribPointer
调用的属性索引。 这些电话仍然是必要的。
着色器声明是不够的,因为您仍然需要提供glVertexAttribPointer
参数中的信息,例如规范化,数据类型等。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.