众所周知,在 OpenGL ES 着色器中,分支的计算成本特别高。在这样的着色器中,我在除以某个值之前检查该值是否为空,例如:
if(value == 0.0)
other_value = 0.0;
else
other_value = 1.0 / value;
为了加快速度,我想通过直接执行以下操作来避免此if
:
other_value = 1.0 / value;
我想知道如果value
碰巧等于0会发生什么,这在我的治疗中有点罕见,这就是为什么测试它并不简单。着色器会崩溃吗?应用程序是否崩溃?
最佳答案
确实未定义。
在 iPad 模拟器上,将红色分量除以 0.0 得到 0(这张图片中所有红色都消失了)。
在 iPad 硬件上,将 r 分量除以 0.0 使其饱和为全红色(即 +无穷大钳位)。
所以不,你根本不能依赖未定义的行为来产生一致的结果,但除以 0 本身并不会发生什么坏事。
在我的着色器中,我将 RGB 值除以 alpha。碰巧的是,如果 alpha 值为 0,像素无论如何都不会显示,所以我对任何一种除法(给出 0 或 +inf)都没有问题。
关于iphone - 在着色器中除以 0 时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5802351/