WebGL:如何绑定一个采样器数组
WebGL: How to bind an array of samplers
如前所述,可以"将所有纹理绑定到着色器中的采样器数组,然后使用顶点属性对其进行索引"。我该如何进行绑定呢?目前我绑定我的纹理像这样(如果这是正确的在第一个地方;它至少可以工作):
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);
}
现在绑定采样器数组,我会扔掉activeTexture
和bindTexture
,并使用这样的东西吗?
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规范不支持,它声明不支持采样器的动态索引(即使用非常量变量的索引)。
相关文章:
- Javascript(Angular)从一个对象数组到第二个数组查找值
- 根据id将json数组组合为一个json数组
- JavaScript数组包含一个值
- 对一个对象使用reduce可以返回一个没有't在数组中包含目标字母
- jQuery$.inArray()总是返回-1和一个对象数组
- 在数组中的一个元素上设置多个值
- javascript处理一个对象数组以获得一个新的对象数组
- 作为一个二维数组,从ajax接收
- 你能用来自数组的属性名称生成一个对象吗
- 多维关联数组的最后一个索引
- 如何创建一个方法来验证数组的范围
- 循环以检查数组中的最后一个图像
- 在Javascript中将一个值和字符串数组转换为if语句
- 算法:从数组(javascript/angular)中按当前日期获取上一个和下一个事件
- 如何将一个对象添加到每个对象数组中
- 如何创建一个谷歌地图地理坐标数组
- 如何从另一个带下划线的数组中筛选带元素的数组
- 如何在PHP数组中加载下一个youtube
- 查找对象数组是否包含其中一个标记的最快方法
- 如何使用Javascript和Ajax传递一个HTML选择标签到PHP $_POST与一个(数组)var当名称属性是一个