WebGLRenderingContext: enableVertexAttribArray() 方法

Baseline 已广泛支持

此特性已相当成熟,可在许多设备和浏览器版本上使用。自 ⁨2015 年 7 月⁩以来,各浏览器均已提供此特性。

注意:此功能在 Web Workers 中可用。

WebGLRenderingContextenableVertexAttribArray() 方法是 WebGL API 的一部分,它用于打开指定索引处的通用顶点属性数组。这些数组存储在 WebGL 上下文维护的属性数组列表中。

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

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

无论哪种情况,由于属性必须启用才能使用,并且默认是禁用的,因此你需要调用 enableVertexAttribArray() 来启用各个属性,以便它们能够被使用。一旦完成此操作,就可以使用其他方法来访问属性,包括 vertexAttribPointer()vertexAttrib*()getVertexAttrib()

语法

js
enableVertexAttribArray(index)

参数

index

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

返回值

无(undefined)。

错误

要在调用 enableVertexAttribArray() 后检查错误,请调用 getError()

WebGLRenderingContext.INVALID_VALUE

指定的 index 无效;即,它大于或等于上下文的顶点属性列表允许的最大条目数,该数量由 WebGLRenderingContext.MAX_VERTEX_ATTRIBS 的值指示。

示例

这段代码——摘自完整示例 一个基本的 2D WebGL 动画示例——展示了如何使用 enableVertexArray() 来激活将被 WebGL 层用于将单个顶点从顶点缓冲区传入顶点着色器函数的属性。

js
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 动画示例”中的 animateScene() 函数。请参阅该文章以获取完整示例,并查看实际的动画效果。

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

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

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

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

规范

规范
WebGL 规范
# 5.14.10

浏览器兼容性

另见