2016-09-12 6 views
2

Я работаю над фрагментарным шейдером. Он работает, но он по-прежнему нуждается в некоторой оптимизации.Как заставить разветвление GLSL?

Насколько я знаю, большинство ветвей дел в GLSL сглажены, поэтому оба случая выполнены. Я исключил большинство условий if-else, но есть некоторые из них, которые должны оставаться такими, какими они есть, потому что обе ветви дороги для исполнения. Я знаю, что в HLSL есть ключевое слово [branch]. Но как это можно решить в GLSL?

Мой код выглядит следующим образом (условия не являются единообразными, их результаты зависят от расчетов в шейдере):

if(condition) { 
    expensive calculations... 
} 

if(condition2) { 
    expensive calculations... 
} 

if(condition3) { 
    expensive calculations... 
} 

... 

Один «дорогой расчет» может изменить переменные, на которых условие будет зависеть. Возможно, что выполняется более одного вычисления.

Я знаю, что есть более старые или мобильные GPU-ы, которые не поддерживают разветвление вообще. В этом случае это не имеет никакого отношения к этому вопросу.

+0

Вы уже исключили большинство простых методов оптимизации для своего случая. Я думаю, вы должны полностью переосмыслить, и это будет сложно. Показывать, какие дорогие расчеты вы делаете, может помочь. – codetiger

+0

Я не могу избежать ветвления, если я делаю что-то вроде трассировки лучей или лучевого марширования –

+1

То, как современная работа GPGPU требует от них выполнения всех ветвей заданного оператора if в последовательности (возможно, заставляя группу ядер простаивать тем временем). Поэтому это ограничение, к сожалению, не может быть устранено. Как справедливо указал @codetiger, здесь, вероятно, нет простого решения, но вы должны попытаться найти одно (или приближение), тем не менее. – Bartvbl

ответ

1

GLSL не имеет механизма для применять ветвление (или принудительное выравнивание ветви).