openGL之API学习(一五五)glsl中mod的奇怪结果

在GLSL中,发现mod函数对于某些整数操作产生非预期结果,例如mod(2049, 2)返回0而非1。问题源于GLSL的mod不接受整型参数,只接受浮点类型,导致结果有时会加1但不小于除数时调整为0。修正此问题的方法是将所有参数转换为浮点类型,如mod(2049.0, 2.0)。" 107605399,9807201,IntelliJ IDEA Debug 深度解析,"['IntelliJ IDEA', '调试工具', '开发技巧', 'Java开发']

mod(2048,10)的结果为8

 

mod(2049.0,10.0)的结果为9.0

mod(249,10)的结果为9

 

 

mod(2049,1)的结果为0,正确。

mod(2049,2)的结果为0,而不是1,奇怪之处!!!!!!!!!!!

mod(2049,3)的结果为0,正确。

mod(2049,4)的结果为2,而不是1,奇怪之处!!!!!!!!!!!

mod(2049,5)的结果为0,而不是4,奇怪之处!!!!!!!!!!!

mod(2049,6)的结果为4,而不是3,奇怪之处!!!!!!!!!!!

mod(2049,7)的结果为6,而不是5,奇怪之处!!!!!!!!!!!

mod(2049,8)的结果为2,而不是1,奇怪之处!!!!!!!!!!!

mod(2049,9)的结果为7,而不是6,奇怪之处!!!!!!!!!!!

mod(2049,10)的结果为0,而不是9,奇怪之处!!!!!!!!!!

只要能被2049整除的都没问题,不能整除的为正确余数加1,增加的数值不小于除数的调整为0

 

上述奇怪之处改为如下形式就恢复正常了:

mod(2049.0,8.0)结果为1.0

mod的定义是这样的:

genType mod( 	genType x,
  	float y);
 
genType mod( 	genType x,
  	genType y);
 
genDType mod( 	genDType x,
  	double y);
 
genDType mod( 	genDType x,
  	genDType y);

genType指的是float, vec2, vec3, or vec4

genDType指的是double, dvec2, dvec3, or dvec4

mod是没有整型参数的,因为没有genIType(int, ivec2, ivec3, or ivec4)。所以就可能造成结果异常。

 

 

mod的实现原理为:

 x - y * floor(x/y)

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值