2
私はフラグメントシェーダーで作業しています。それは動作しますが、まだ最適化が必要です。GLSL分岐を強制するには?
私が知る限り、GLSLのケースブランチのほとんどは平坦化されているため、両方のケースが実行されます。私はif-else条件の大部分を排除しましたが、両方のブランチが実行するのに費用がかかるため、そのまま残しておかなければならないものがいくつかあります。私は、HLSLではこの問題のキーワードが[branch]
であることを知っています。しかし、GLSL
でそれをどのように解決することが可能ですか?私のコードは、この(条件は一様ではなく、その結果はシェーダでの計算に依存)のように見えます
:
if(condition) {
expensive calculations...
}
if(condition2) {
expensive calculations...
}
if(condition3) {
expensive calculations...
}
...
一つ「高価な計算」の条件が異なりますどの変数を変更することができます。複数の計算が実行される可能性があります。
私はブランケットをまったくサポートしていない古いGPUまたはモバイルGPUがあることを知っています。その場合、この問題とは関係ありません。
あなたはすでに、ケースのための単純な最適化テクニックのほとんどを除外しました。私はあなたが完全に再考しなければならないと思うし、そのトリッキーになるだろう。あなたが行っている高価な計算の種類を示すことは、さらに助けになるかもしれません。 – codetiger
レイトレーシングやレイマーチングのようなものを行うと、分岐を避けることはできません –
現代のGPGPUの作業では、指定されたif文のすべての分岐を順番に実行する必要があります(その間にコア群がアイドル状態になる可能性があります)。したがって、残念ながらそれを排除できないという限界があります。 @codetigerが正当に指摘しているように、ここには簡単な解決策はないかもしれませんが、それにもかかわらず1つ(または近似値)を見つけようとするべきです。 – Bartvbl