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 回答
0

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

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

这种技术应该可以在 OpenGL 中使用。然而,它不受WebGL 规范的支持,该规范声明不支持采样器的动态索引(即使用非常量变量进行索引)。请参阅此处的 WebGL 规范。

于 2013-06-13T20:52:31.970 回答