无法在 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
今天在写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