【发布时间】:2016-02-27 18:41:32
【问题描述】:
我想在 WebGL 片段着色器中获得 x 和 y 的精确模数。 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 崩溃,并在 ring 0 中出现错误。它适用于我需要它的 spritesheet 计算,但我真的觉得这是一个不正确的解决方案。
(更新:它在我的手机上完美运行。现在不是我的代码出错了,这只是我的问题……)
【问题讨论】:
标签: webgl shader fragment-shader