2012-05-09 27 views
1

私は非常に単純な問題を抱えていますが、私は解決策が見つからないので、壁に頭をぶつけています。他の浮動小数点を使った逆浮動小数点

私は組み込みシステムでシェーダプロセッサを使用していますが、フラグメントシェーダのパフォーマンスが悪いため条件文を使用できません。

Iは第2フロート1.

基本的

if(floatA==1.0) 
    { 
     if(floatB==1.0) 
     { 
      floatB=0.0; 
     } 
     else 
     { 
      floatB=1.0; 
     } 
    } 

である場合、私は第一フロートの値を反転する0または1

ことができる両方、2つのfloatを有します - 条件なしで数学的にx..X

アイデア? :D

+0

精度が不足しているため一定の値を保持することが保証されていないため、この厳密な方法で浮動小数点数を比較しないでください。 – djmj

+1

@djmj一般的には間違っています。これらの値は、不正確な数学演算(ここではそうかもしれませんが、誰が知っているか)の後にそのような値を保持することは保証されていません。しかし浮動小数点数を正確な値(表現可能であることが保証されているか、または特定の演算の結果であることが保証されているかどうかは、確かに0であると保証されている)と比較すること自体は一般的に悪い考えではありません。むしろ、私は独断的なものを浮動小数点表現とは比較しないでください。 –

+1

@ChristianRauはこれを認識していました。あなたが「知っている人」と言ったように、そのコードスニペットでは、なぜ私がそれを言ったのかは誰にも分かりません。このようなコードスニペットを読んだ場合、私はそのコードの前にすべてを仮定します。完成した頂点シェーダーコードとフラグメントシェーダーコードが表示されたら、私のコメントは異なるかもしれません。まだあなたの詳細なコメントに投票しました。 – djmj

答えて

3

方法に関する:

floatB = (floatA * (1 - floatB)) + ((1 - floatA) * floatB)

floatAがfloatAはfloatB = floatB次いで、ゼロであるそうでない場合、次いで、floatB = 1-floatB 1である場合、

+0

あなたの解決策を見たときに私の答えを編集しようとしていました! –

+1

+1補足として、GLSLのようなシェーディング言語を使用するときは、ブレンドに組み込み関数を使用することもできます( 'mix(floatB、1.0-floatB、floatA)')、手書きより高速かもしれません。 –

関連する問題