无法在 glsl 中使用“%”

Unable to use '%' in glsl

今天在写shader程序的时候,遇到一个情况,必须用%求余数。 GLSL给我一个错误,说它在当前版本中不可用。

我试过几个问题。 GLSL 不支持递归函数和 while 循环,如果我想创建一个可以给我 (a % b).

结果的函数,这是必需的

所以,我目前被困住了。有人可以帮我解决这个问题吗?

编辑。我试图使用 this website 中的一些着色器代码作为参考代码来模拟 CRT 屏幕。我想修改特定行和列的像素颜色,所以我需要使用模运算符。

起初,我以为取模函数是使用%运算符完成的。它没有用,所以我尝试使用递归 function/while 循环作为解决方法 对于模函数,它也不起作用。

GLSL doesn't support recursive function and while loops, which is needed if I want to create a function that can give me the result of (a % b).

首先,计算 a mod b 不需要递归或循环。 a - (b * floor(a/b)).

很容易做到

这正是内置 mod 函数的作用。如果您的 GLSL 版本不支持 % 运算符,那么您可能也无法获得实数。因此,只需对您的值使用 mod 函数即可。

我正在使用 webgl2。似乎在 GLSL 中不会发生隐式转换。 所以 floor( 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 returns the value of x modulo y. This is computed as x - y * floor(x/y).

QUOTE_SOURCE: https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/mod.xhtml