2017-05-24 8 views
0

float brightnessには2つのベクトルのドット生成があります。 brightnessはほとんどの場合は正であるべきですが、私がmax(brightness, 0.0)を使用していることを確認する必要があります。照明システムにbrightnessを使用しようとすると、何も表示されません。私はif文でこれをデバッグしようとしましたが、常に真実か何かを返すようです。したがって、if(brightness > 99999)if(brightness < 99999)またはif(brightness == 12345)はすべてピクセルを破棄します。私はGLSLバージョン430コアを使用しています。GLSL常にtrueを返す場合

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

if(brightness < -999) { 

    discard; 

} 

この例では、ピクセルを破棄します。

答えて

0

ほとんどの場合、ベクトル1またはベクトル2の成分にNaNがある可能性があります(NaN =>数値ではなく、ベクトル1またはベクトル2の計算でゼロで除算される場合があります)。

NaNを検出する方法のためにこれを参照してください:だからあなたはベクトル1つの&ベクトル2が計算されている方法を見てする必要がある問題を解決するために How to deal with NaN or inf in OpenGL ES 2.0 shaders

を。廃棄は上記のコードで実行されることは全く不可能である

// 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 /ベクトル2の定数値を使用し、NaNでの問題です。 これがまだ起こっていると思われる場合は、ifテスト後のコードがfragColor.rgbを黒に設定するか、fragColor.aをゼロに設定してブレンディングが有効になっている場合にピクセルが表示されなくなる可能性があります。

+0

私はNaNかもしれないと思っていましたが、実際にはこれらのベクトルのすべての変化をトレースしようとしていました。私は今それをもう一度見せます。 – Maineri

+0

私は間違いを見つけました。あなたは正しかった。ベクター2はNaNであった。私はvec4として頂点シェーダーからそのベクトル2を誤って出力し、フラグメントシェーダーでvec3として入力しました。ありがとうございました! – Maineri

関連する問題