WebGLRenderingContext: getActiveUniform() 方法

Baseline 已廣泛支援

此特性已相當成熟,可在許多裝置和瀏覽器版本上使用。自 ⁨2015 年 7 月⁩以來,各瀏覽器均已提供此特性。

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

WebGLRenderingContext.getActiveUniform() 方法是 WebGL API 的一部分,它返回一個 WebGLActiveInfo 物件,其中包含 uniform 屬性的大小、型別和名稱。它通常用於查詢未知的 uniform,以進行除錯或通用庫建立。

語法

js
getActiveUniform(program, index)

引數

program

一個 WebGLProgram,指定要從中獲取 uniform 變數資訊的 WebGL 著色器程式。

index

一個 GLuint,指定要獲取的 uniform 屬性的索引。此值是 0 到 N - 1 的索引,由 gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS) 返回。

返回值

一個 WebGLActiveInfo 物件,描述該 uniform。

返回值中的 type 屬性將是以下值之一:

  • gl.FLOAT
  • gl.FLOAT_VEC2
  • gl.FLOAT_VEC3
  • gl.FLOAT_VEC4
  • gl.INT
  • gl.INT_VEC2
  • gl.INT_VEC3
  • gl.INT_VEC4
  • gl.BOOL
  • gl.BOOL_VEC2
  • gl.BOOL_VEC3
  • gl.BOOL_VEC4
  • gl.FLOAT_MAT2
  • gl.FLOAT_MAT3
  • gl.FLOAT_MAT4
  • gl.SAMPLER_2D
  • gl.SAMPLER_CUBE
  • 當使用 WebGL 2 context 時,還可以使用以下值:
    • gl.UNSIGNED_INT
    • gl.UNSIGNED_INT_VEC2
    • gl.UNSIGNED_INT_VEC3
    • gl.UNSIGNED_INT_VEC4
    • gl.FLOAT_MAT2x3
    • gl.FLOAT_MAT2x4
    • gl.FLOAT_MAT3x2
    • gl.FLOAT_MAT3x4
    • gl.FLOAT_MAT4x2
    • gl.FLOAT_MAT4x3
    • gl.SAMPLER_3D
    • gl.SAMPLER_2D_SHADOW
    • gl.SAMPLER_2D_ARRAY
    • gl.SAMPLER_2D_ARRAY_SHADOW
    • gl.SAMPLER_CUBE_SHADOW
    • gl.INT_SAMPLER_2D
    • gl.INT_SAMPLER_3D
    • gl.INT_SAMPLER_CUBE
    • gl.INT_SAMPLER_2D_ARRAY
    • gl.UNSIGNED_INT_SAMPLER_2D
    • gl.UNSIGNED_INT_SAMPLER_3D
    • gl.UNSIGNED_INT_SAMPLER_CUBE
    • gl.UNSIGNED_INT_SAMPLER_2D_ARRAY

呼叫 gl.linkProgram 時,WebGL 會建立一個活動的 uniform 列表。這些是 getActiveUniform 返回值的 name 屬性的可能值。WebGL 根據 uniform 在著色器中宣告的型別,在列表中生成一個或多個條目。

  • 基本型別的單一變數:一個條目,名稱為 uniform 的名稱。例如:uniform vec4 a; 將生成 a

  • 基本型別陣列:一個條目,名稱為 uniform 的名稱,後跟 [0]。例如:uniform vec4 b[]; 將生成 b[0]

  • 結構體型別:結構體的每個成員一個條目。例如:uniform struct { float foo; vec4 bar; } c; 將生成 c.fooc.bar

  • 結構體或陣列的陣列:陣列的每個條目將生成其自己的條目。例如:uniform struct { float foo; vec4 bar; } d[2]; 將生成:

    • d[0].foo
    • d[0].bar
    • d[1].foo
    • d[1].bar
  • Uniform 塊:每個成員一個條目。如果 uniform 塊具有例項名稱,則會加上塊名稱字首。例如:uniform Block { float foo; }; 將生成 foo,而 uniform Block { float bar; } e; 將生成 e.bar

返回值中的 size 屬性對應於宣告為陣列的 uniform 的陣列長度。否則,其值為 1(這包括例項化的介面塊陣列)。

異常

  • 如果程式 WebGLProgram 無效(未連結、已刪除等),則生成 gl.INVALID_VALUE
  • 如果索引不在 [0, gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS) - 1] 範圍內,則生成 gl.INVALID_VALUE

示例

js
const numUniforms = gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS);
for (let i = 0; i < numUniforms; ++i) {
  const info = gl.getActiveUniform(program, i);
  console.log("name:", info.name, "type:", info.type, "size:", info.size);
}

規範

規範
WebGL 規範
# 5.14.10

瀏覽器相容性

另見