在今天编写着色器程序时,我遇到了一种情况,即我必须使用%
来查找其余的代码。GLSL给了我一个错误,说它在当前版本中是不可用的。
我试过几个问题。GLSL不支持递归函数和want循环,如果我想创建一个可以给出(a % b)
结果的函数,就需要这样的函数。
所以我现在被困住了。有人能帮我吗?
编辑.我试图用一些来自本网站的着色器代码作为参考代码来模拟CRT屏幕。我想修改某些行和列的像素的颜色,所以我需要使用模运算符。
首先,我认为模数函数是用%
算子来完成的。它不起作用,所以我尝试使用递归函数/while循环作为模数函数的一种解决方法,但它也不起作用。
发布于 2016-02-02 15:01:54
GLSL不支持递归函数和while循环,如果我想要创建一个可以给出(a % b)的结果的函数,这是必需的。
首先,计算a mod b
不需要递归或循环。a - (b * floor(a/b))
很容易做到这一点。
这正是内置的mod
函数所做的。如果您的GLSL版本不支持%
运算符,那么您可能也无法得到真正的整数。因此,只需在值上使用mod
函数即可。
发布于 2020-05-22 03:47:08
我正在使用webgl2。在GLSL中似乎没有发生隐式转换。因此地板( int(2) / int(3) )是无效的。我非常肯定(但不是肯定的)整数之间的除法应该会导致截断(从而导致地板)。但为了安全起见,我决定用一种类型转换解决方案。
//:unsigned integers
uint mod_u32( uint u32_bas , uint u32_div ){
float flt_res = mod( float(u32_bas), float(u32_div));
uint u32_res = uint( flt_res );
return( u32_res );
}
//:signed integers
uint mod_i32( uint i32_bas , uint i32_div ){
float flt_res = mod( float(i32_bas), float(i32_div));
uint i32_res = uint( flt_res );
return( i32_res );
}
如果您确信整数之间的除法会导致截断小数(小数)部分,那么:
x - y * (x/y)
应该是你所需要的,因为:
mod返回x模y的值。这是计算为x*层(x/y)。
QUOTE_SOURCE:https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/mod.xhtml
https://stackoverflow.com/questions/35155598
复制相似问题