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

瀏覽器相容性

另見