GLSL如果总是返回true

时间:2017-05-24 07:50:39

标签: glsl shader

我有float brightness,其中包含2个向量的点数。大多数时候brightness应该是肯定的,但要确保我使用max(brightness, 0.0)。当我尝试在我的照明系统中使用brightness时,显示屏上没有显示任何内容。我尝试用if语句调试它,但似乎它总是返回true或者其他东西。因此,if(brightness > 99999)if(brightness < 99999)if(brightness == 12345)都会丢弃该像素。我正在使用GLSL版本430核心。

float brightness = dot(vector1, vector2);
brightness = max(brightness, 0.0);

if(brightness < -999) {

    discard;

}

所以在这个例子中^它将丢弃像素。

1 个答案:

答案 0 :(得分:0)

你很可能在vector1或vector2组件中有NaN(NaN =&gt;不是数字,如果在vector1或vector2计算期间存在除零,则会发生这种情况。)

请查看此方法以检测NaN: How to deal with NaN or inf in OpenGL ES 2.0 shaders

所以要解决这个问题,你需要看一下vector1&amp; vector2是计算出来的。

为了确认这是一个NaN问题,请使用vector1 / vector2的常量值,如:

// force values so we are sure dot will be 1.0
vector1 = vec3(1.0,0.0,0.0);
vector2 = vec3(1.0,1.0,0.0);

float brightness = dot(vector1, vector2);
brightness = max(brightness, 0.0);

// so this should never execute since dot is 1.0
if(brightness < -999) {
   discard;
}

完全不可能使用上面的代码执行丢弃。 如果您认为这种情况仍然存在,那么只有其他可能的解释是if测试之后的代码将fragColor.rgb设置为black或fragColor.a为零,如果启用了混合,则不会显示像素。