我希望在WebGL片段着色器中准确计算
绘制
在JavaScript中,我可以调试它,函数运行得非常完美。然后我尝试了迭代方法,因为我担心自己疯了,并且我也不信任浮点数除法。
这个方法是有效的,但无法制图。当我尝试制图时,会在Linux中出现环0错误并导致崩溃。对于我需要使用的精灵表计算来说,它可以正常工作,但我认为这不是正确的解决方案。
(更新:在我的手机上完美运行。现在不是我的代码出错了,只是我的问题……)
x
和y
的模数。x
和y
为整数。绘制
mod(x,y)
,我们得到以下图像:
生成红黑矩形的实际代码如下:gl_FragColor = vec4(mod(
float(int(v_texCoord[0]*15.))/15.,
float(int(v_texCoord[1]*15.))/15.
), 0, 0, 1);
v_texCoord是一个vec2类型的变量,范围从左上角的0,0
到右下角的1,1
。float和int都设定为mediump。
通过查看表格,我们可以发现尽管mod(6,6)
计算结果正确为0
,但是mod(7,7)
实际上是7
!怎么解决这个问题?
我尝试了自己实现mod()函数,然而它也有同样的错误,并产生相同的图形。
int func_mod(int x, int y) {
return int(float(x)-float(y)*floor(float(x)/float(y)));
}
在JavaScript中,我可以调试它,函数运行得非常完美。然后我尝试了迭代方法,因为我担心自己疯了,并且我也不信任浮点数除法。
int iter_mod(int x, int y) {
x = int(abs(float(x))); y = int(abs(float(y)));
for(int i=0; i>-1; i++) {
if(x < y) break;
x = x - y;
}
return x;
}
这个方法是有效的,但无法制图。当我尝试制图时,会在Linux中出现环0错误并导致崩溃。对于我需要使用的精灵表计算来说,它可以正常工作,但我认为这不是正确的解决方案。
(更新:在我的手机上完美运行。现在不是我的代码出错了,只是我的问题……)
x % y
,我会得到'%' : integer modulus operator supported in GLSL ES 3.00 and above only
的错误提示。据我所知,只有在我们在脚本开头指定#version 130
的情况下,模数运算符才是有效的,但是据我所知,目前没有浏览器支持GLSL ES的这个版本。 - Joshua Walsh#version 300 es
并且它可以正常工作。 - Joshua Walsh