WebGLRenderingContext: getActiveUniform() 方法
注意:此功能在 Web Workers 中可用。
WebGLRenderingContext.getActiveUniform() 方法是 WebGL API 的一部分,它返回一個 WebGLActiveInfo 物件,其中包含 uniform 屬性的大小、型別和名稱。它通常用於查詢未知的 uniform,以進行除錯或通用庫建立。
語法
getActiveUniform(program, index)
引數
program-
一個
WebGLProgram,指定要從中獲取 uniform 變數資訊的 WebGL 著色器程式。 index-
一個
GLuint,指定要獲取的 uniform 屬性的索引。此值是 0 到 N - 1 的索引,由gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS)返回。
返回值
一個 WebGLActiveInfo 物件,描述該 uniform。
返回值中的 type 屬性將是以下值之一:
gl.FLOATgl.FLOAT_VEC2gl.FLOAT_VEC3gl.FLOAT_VEC4gl.INTgl.INT_VEC2gl.INT_VEC3gl.INT_VEC4gl.BOOLgl.BOOL_VEC2gl.BOOL_VEC3gl.BOOL_VEC4gl.FLOAT_MAT2gl.FLOAT_MAT3gl.FLOAT_MAT4gl.SAMPLER_2Dgl.SAMPLER_CUBE- 當使用 WebGL 2 context 時,還可以使用以下值:
gl.UNSIGNED_INTgl.UNSIGNED_INT_VEC2gl.UNSIGNED_INT_VEC3gl.UNSIGNED_INT_VEC4gl.FLOAT_MAT2x3gl.FLOAT_MAT2x4gl.FLOAT_MAT3x2gl.FLOAT_MAT3x4gl.FLOAT_MAT4x2gl.FLOAT_MAT4x3gl.SAMPLER_3Dgl.SAMPLER_2D_SHADOWgl.SAMPLER_2D_ARRAYgl.SAMPLER_2D_ARRAY_SHADOWgl.SAMPLER_CUBE_SHADOWgl.INT_SAMPLER_2Dgl.INT_SAMPLER_3Dgl.INT_SAMPLER_CUBEgl.INT_SAMPLER_2D_ARRAYgl.UNSIGNED_INT_SAMPLER_2Dgl.UNSIGNED_INT_SAMPLER_3Dgl.UNSIGNED_INT_SAMPLER_CUBEgl.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.foo和c.bar。 -
結構體或陣列的陣列:陣列的每個條目將生成其自己的條目。例如:
uniform struct { float foo; vec4 bar; } d[2];將生成:d[0].food[0].bard[1].food[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。
示例
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 |
瀏覽器相容性
載入中…