WebGLRenderingContext: enableVertexAttribArray() 方法

基线 广泛可用

此功能非常成熟,可在许多设备和浏览器版本中正常工作。它自 2015 年 7 月.

报告反馈

WebGLRenderingContext 方法 enableVertexAttribArray()WebGL API 的一部分,用于打开指定索引处的通用顶点属性数组,该索引位于属性数组列表中。

注意:您可以通过调用 disableVertexAttribArray() 来禁用属性数组。

在 WebGL 中,应用于特定顶点的值存储在 属性 中。这些属性仅对 JavaScript 代码和顶点着色器可用。属性通过索引号进行引用,该索引号指向 GPU 维持的属性列表中的一个索引。某些顶点属性索引可能具有预定义的用途,具体取决于平台和/或 GPU。其他属性在您创建属性时由 WebGL 层分配。

语法

无论哪种方式,由于属性在启用之前都无法使用,并且默认情况下是禁用的,因此您需要调用 enableVertexAttribArray() 来启用各个属性,以便可以使用它们。完成后,其他方法可以用于访问属性,包括 vertexAttribPointer()vertexAttrib*()getVertexAttrib()
enableVertexAttribArray(index)

js

参数

index

一个 GLuint,指定唯一标识要启用的顶点属性的索引号。如果您知道属性的名称但不知道其索引,则可以通过调用 getAttribLocation() 来获取索引。

返回值

无 (undefined).

示例

指定的 index 无效;也就是说,它大于或等于上下文顶点属性列表中允许的最大条目数,如 WebGLRenderingContext.MAX_VERTEX_ATTRIBS 的值所示。

无论哪种方式,由于属性在启用之前都无法使用,并且默认情况下是禁用的,因此您需要调用 enableVertexAttribArray() 来启用各个属性,以便可以使用它们。完成后,其他方法可以用于访问属性,包括 vertexAttribPointer()vertexAttrib*()getVertexAttrib()
gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);

aVertexPosition = gl.getAttribLocation(shaderProgram, "aVertexPosition");

gl.enableVertexAttribArray(aVertexPosition);
gl.vertexAttribPointer(
  aVertexPosition,
  vertexNumComponents,
  gl.FLOAT,
  false,
  0,
  0,
);

gl.drawArrays(gl.TRIANGLES, 0, vertexCount);

此代码(摘自完整示例 基本的 2D WebGL 动画示例)展示了使用 enableVertexArray() 激活属性的方法,该属性将由 WebGL 层用于将单个顶点从顶点缓冲区传递到顶点着色器函数中。

注意:此代码段摘自 "基本的 2D WebGL 动画示例" 中的 animateScene() 函数。请参阅该文章以了解完整示例,并查看实际动画的效果。

此代码通过调用 bindBuffer() 来设置将用于绘制形状三角形的顶点缓冲区。然后,通过调用 getAttribLocation() 从着色器程序中获取顶点位置属性的索引。

现在顶点位置属性的索引已在 aVertexPosition 中可用,我们调用 enableVertexAttribArray() 来启用位置属性,以便它可以被着色器程序(特别是顶点着色器)使用。

然后,通过调用 vertexAttribPointer() 将顶点缓冲区绑定到 aVertexPosition 属性。此步骤并不明显,因为此绑定几乎是一种副作用。但结果是,访问 aVertexPosition 现在将从顶点缓冲区获取数据。

规范

现在形状的顶点缓冲区与用于将顶点逐个传递到顶点着色器的 aVertexPosition 属性之间建立了关联,我们就可以通过调用 drawArrays() 来绘制形状。
规范
# 5.14.10

浏览器兼容性

WebGL 规范

另请参阅