WebGL:如何绑定一个采样器数组

WebGL: How to bind an array of samplers

本文关键字:一个 数组 采样器 绑定 何绑定 WebGL      更新时间:2023-09-26

如前所述,可以"将所有纹理绑定到着色器中的采样器数组,然后使用顶点属性对其进行索引"。我该如何进行绑定呢?目前我绑定我的纹理像这样(如果这是正确的在第一个地方;它至少可以工作):

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]);

没关系,我想我找到解决办法了。我的代码如下所示:

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]正确地访问片段着色器中的采样器。

如果我理解你正确链接到的问题的描述,建议是保留API代码原样,并在着色器中指定采样器数组。然后通过属性对该数组进行索引。比如:

uniform sampler2D samplers[8];
uniform int index;
..
vec4 color = texture2D(samplers[index], coord);

这项技术应该在OpenGL中工作。然而,WebGL规范不支持,它声明不支持采样器的动态索引(即使用非常量变量的索引)。