Я работаю над фрагментарным шейдером. Он работает, но он по-прежнему нуждается в некоторой оптимизации.Как заставить разветвление GLSL?
Насколько я знаю, большинство ветвей дел в GLSL сглажены, поэтому оба случая выполнены. Я исключил большинство условий if-else, но есть некоторые из них, которые должны оставаться такими, какими они есть, потому что обе ветви дороги для исполнения. Я знаю, что в HLSL есть ключевое слово [branch]
. Но как это можно решить в GLSL
?
Мой код выглядит следующим образом (условия не являются единообразными, их результаты зависят от расчетов в шейдере):
if(condition) {
expensive calculations...
}
if(condition2) {
expensive calculations...
}
if(condition3) {
expensive calculations...
}
...
Один «дорогой расчет» может изменить переменные, на которых условие будет зависеть. Возможно, что выполняется более одного вычисления.
Я знаю, что есть более старые или мобильные GPU-ы, которые не поддерживают разветвление вообще. В этом случае это не имеет никакого отношения к этому вопросу.
Вы уже исключили большинство простых методов оптимизации для своего случая. Я думаю, вы должны полностью переосмыслить, и это будет сложно. Показывать, какие дорогие расчеты вы делаете, может помочь. – codetiger
Я не могу избежать ветвления, если я делаю что-то вроде трассировки лучей или лучевого марширования –
То, как современная работа GPGPU требует от них выполнения всех ветвей заданного оператора if в последовательности (возможно, заставляя группу ядер простаивать тем временем). Поэтому это ограничение, к сожалению, не может быть устранено. Как справедливо указал @codetiger, здесь, вероятно, нет простого решения, но вы должны попытаться найти одно (или приближение), тем не менее. – Bartvbl