GLSL If始终返回true

GLSL If始终返回true,glsl,shader,Glsl,Shader,我有浮动亮度,其中有两个向量的点生成亮度在大多数情况下应为正值,但为了确保使用max(亮度,0.0)。当我尝试在照明系统中使用亮度时,屏幕上没有显示任何内容。我试图用if语句调试它,但它似乎总是返回true或其他什么。因此if(亮度>99999)和if(亮度

我有
浮动亮度
,其中有两个向量的点生成<代码>亮度在大多数情况下应为正值,但为了确保使用
max(亮度,0.0)
。当我尝试在照明系统中使用
亮度
时,屏幕上没有显示任何内容。我试图用if语句调试它,但它似乎总是返回true或其他什么。因此
if(亮度>99999)
if(亮度<99999)
if(亮度==12345)
都会丢弃像素。我正在使用GLSL版本430核心

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

if(brightness < -999) {

    discard;

}
float亮度=点(矢量1,矢量2);
亮度=最大值(亮度,0.0);
如果(亮度<-999){
丢弃;
}

因此,在本例中,^它将丢弃像素。

在vector1或vector2组件中很可能有一个NaN(NaN=>不是一个数字,如果在vector1或vector2计算过程中有一个除以零的值,则可能发生)

有关检测NaN的方法,请参见以下内容:

因此,要解决这个问题,您需要了解vector1和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;
}
//强制值,因此我们确定点为1.0
vector1=vec3(1.0,0.0,0.0);
vector2=vec3(1.0,1.0,0.0);
浮动亮度=点(矢量1、矢量2);
亮度=最大值(亮度,0.0);
//所以这永远不应该执行,因为dot是1.0
如果(亮度<-999){
丢弃;
}
用上面的代码执行放弃是完全不可能的。
如果您认为这种情况仍然存在,那么唯一可能的解释是,If测试后的代码会将fragColor.rgb设置为黑色或fragColor.a设置为零,从而在启用混合时不会显示任何像素。

我认为可能是NaN,实际上我正在尝试跟踪这些向量中的每个变化。我现在再看一看,我发现了错误。你是对的。矢量2是NaN。我意外地将顶点着色器中的向量2输出为vec4,并在片段着色器中输入为vec3。非常感谢。