Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在WebGL中使用制服(或类似)进行循环的变通方法?_Javascript_Webgl_Shader_Glsles - Fatal编程技术网

Javascript 在WebGL中使用制服(或类似)进行循环的变通方法?

Javascript 在WebGL中使用制服(或类似)进行循环的变通方法?,javascript,webgl,shader,glsles,Javascript,Webgl,Shader,Glsles,我正在WebGL中实现一个片段着色器,遇到了只能在for循环中使用常量表达式的限制。有没有人有合适的解决办法 在我的具体案例中,我正在实现一个双边过滤器,目前在片段着色器中有一个窗口大小指定为常量,但希望能够从JavaScript中更改它。制服不被认为是常量,因此不能在for循环中使用,所以我正在寻找其他实现方法 我唯一能想到的就是从JavaScript读取着色器源代码,解析它并用所需的窗口大小替换常量值,然后重新编译着色器。这对我来说是可行的,但我想知道是否有更简单的方法。如果您想要/需要动态

我正在WebGL中实现一个片段着色器,遇到了只能在for循环中使用常量表达式的限制。有没有人有合适的解决办法

在我的具体案例中,我正在实现一个双边过滤器,目前在片段着色器中有一个窗口大小指定为常量,但希望能够从JavaScript中更改它。制服不被认为是常量,因此不能在for循环中使用,所以我正在寻找其他实现方法


我唯一能想到的就是从JavaScript读取着色器源代码,解析它并用所需的窗口大小替换常量值,然后重新编译着色器。这对我来说是可行的,但我想知道是否有更简单的方法。

如果您想要/需要动态更改循环长度的能力,您可以使用
将循环计数设置为非常大的数字/无穷大,并在达到限制后
中断

uniform int loopLimit;

for (int i = 0; i < 10000; i++) {
  if (i == loopLimit) break;
  // Do your stuff
}  
uniform int loopLimit;
对于(int i=0;i<10000;i++){
如果(i==循环限制)中断;
//做你的事
}  

imo的最佳选择是如您所说,使用js动态生成着色器。这很容易做到,因为js已经很好地支持re,es6也有模板字符串。我不熟悉双边过滤器,但它基本上是卷积效应吗?谢谢,我还没有进入ES6,所以不知道模板字符串。如果你熟悉一些图像处理理论,维基百科在过滤器上有一个不错的页面。计算方法与在时域执行卷积滤波器的蛮力法非常相似,但不幸的是,双边滤波器是非线性的,这意味着使用卷积滤波器可以进行的大多数优化最多只能得到滤波器实际输出的近似值。这看起来可能是我所需要的最简单的方法,只要性能不会受到太多影响。谢谢