2

ここで述べたように、 「必要なすべてのテクスチャをシェーダーのサンプラー配列にバインドし、頂点属性でインデックスを付ける」ことが可能です。バインディングはどうすればいいですか?現在、私は自分のテクスチャを次のようにバインドしています(そもそもそれが正しければ、少なくとも機能します):

sampler[i] = gl.getUniformLocation(program, "u_sampler" + i);
...
for (var i = 0, len = textures.length; i < len; i++) {
    gl.activeTexture(gl.TEXTURE0 + i);
    gl.bindTexture(gl.TEXTURE_2D, textures[i]);
    gl.uniform1i(sampler[i], i);
}

サンプラーの配列をバインドするには、破棄activeTexturebindTextureて次のようなものを使用しますか?

gl.uniform1iv(sampler, [0,...,len-1]);
4

2 に答える 2

2

気にしないで、解決策を見つけたと思います。私のコードは次のようになります。

var texture = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, texture);
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
gl.texParameteri(...
gl.bindTexture(gl.TEXTURE_2D, null);
textures[i] = texture;

...compose texture images...

gl.activeTexture(gl.TEXTURE0 + i);
gl.bindTexture(gl.TEXTURE_2D, textures[i]);
gl.texSubImage2D(gl.TEXTURE_2D, 0, xoffset, yoffset, gl.RGBA, gl.UNSIGNED_BYTE, image);

...fill all textures...

var sampler = gl.getUniformLocation(program, "u_sampler");
var samplerArray = new Int32Array(textures.length);
var len = samplerArray.length;
while (len--) {
    samplerArray[len] = len;
}
gl.uniform1iv(sampler, samplerArray);

u_sampler[i]これで、フラグメント シェーダーのサンプラーに正しくアクセスできるようになりました。

于 2013-12-04T10:26:01.430 に答える