2016-09-12 2 views
2

私はフラグメントシェーダーで作業しています。それは動作しますが、まだ最適化が必要です。GLSL分岐を強制するには?

私が知る限り、GLSLのケースブランチのほとんどは平坦化されているため、両方のケースが実行されます。私はif-else条件の大部分を排除しましたが、両方のブランチが実行するのに費用がかかるため、そのまま残しておかなければならないものがいくつかあります。私は、HLSLではこの問題のキーワードが[branch]であることを知っています。しかし、GLSLでそれをどのように解決することが可能ですか?私のコードは、この(条件は一様ではなく、その結果はシェーダでの計算に依存)のように見えます

if(condition) { 
    expensive calculations... 
} 

if(condition2) { 
    expensive calculations... 
} 

if(condition3) { 
    expensive calculations... 
} 

... 

一つ「高価な計算」の条件が異なりますどの変数を変更することができます。複数の計算が実行される可能性があります。

私はブランケットをまったくサポートしていない古いGPUまたはモバイルGPUがあることを知っています。その場合、この問題とは関係ありません。

+0

あなたはすでに、ケースのための単純な最適化テクニックのほとんどを除外しました。私はあなたが完全に再考しなければならないと思うし、そのトリッキーになるだろう。あなたが行っている高価な計算の種類を示すことは、さらに助けになるかもしれません。 – codetiger

+0

レイトレーシングやレイマーチングのようなものを行うと、分岐を避けることはできません –

+1

現代のGPGPUの作業では、指定されたif文のすべての分岐を順番に実行する必要があります(その間にコア群がアイドル状態になる可能性があります)。したがって、残念ながらそれを排除できないという限界があります。 @codetigerが正当に指摘しているように、ここには簡単な解決策はないかもしれませんが、それにもかかわらず1つ(または近似値)を見つけようとするべきです。 – Bartvbl

答えて

1

GLSLには、ブランチング(またはブランチのフラット化を強制)するメカニズムがありません。

関連する問題