一部の属性が getAttribLocation を介してプログラムにバインドされ、一部の属性が bindAttribLocation を介してプログラムにバインドされている WebGL アプリケーションがあります。
すべての文字列名をプログラムの属性インデックス/値にマッピングする方法はありますか? また、どの時点でこれを行うことができますか?プログラムがリンクされた後に getAttribLocation を呼び出すことができると思いますよね?
一部の属性が getAttribLocation を介してプログラムにバインドされ、一部の属性が bindAttribLocation を介してプログラムにバインドされている WebGL アプリケーションがあります。
すべての文字列名をプログラムの属性インデックス/値にマッピングする方法はありますか? また、どの時点でこれを行うことができますか?プログラムがリンクされた後に getAttribLocation を呼び出すことができると思いますよね?
はい、できます。これは私のCubesからのコードの抜粋です。これは、いくつかの属性をバインドし、他の属性のインデックスを検索します。
for (var attribName in boundAttribLocations) {
var index = boundAttribLocations[attribName];
if (typeof index === "number") {
gl.bindAttribLocation(program, index, attribName);
} else {
if (typeof console !== "undefined") {
console.warn("Enumerable non-number", attribName, "in boundAttribLocations object", boundAttribLocations);
}
}
}
gl.linkProgram(program);
if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
throw new Error(gl.getProgramInfoLog(program));
}
var i, name;
var attribs = Object.create(boundAttribLocations);
for (i = gl.getProgramParameter(program, gl.ACTIVE_ATTRIBUTES) - 1; i >= 0; i--) {
name = gl.getActiveAttrib(program, i).name;
attribs[name] = gl.getAttribLocation(program, name);
}
私の記憶が正しければ、boundAttribLocations
( Object.create
)の継承はattribs
、GL が で列挙しない現在のシェーダーで使用されていないものを含む、すべてのバインドされた属性の有効な場所を含むようになっていますgetActiveAttrib
。