Войти
ПрограммированиеФорумГрафика

if (_n > 0.95) _n = 1; в шейдере

Страницы: 1 2 3 Следующая »
#0
19:21, 16 ноя. 2016

Поговаривают что "IF" шейдерах использовать крайне не желательно ибо тормозит.  Помогите понять что можно использовать что бы решить эту проблему? Я в курсе о существовании min max, но что то никак не пойму как их использовать в этом случае.


#1
19:27, 16 ноя. 2016

ничего не тормозит. плохо говорят.

#2
19:36, 16 ноя. 2016

На крайний случай

_n = mix(_n, 1.0, float(_n > 0.95))

Что то же самое:

_n += float(_n > 0.95) * (1.0 - _n)
#3
19:43, 16 ноя. 2016

вклинюсь в тему, как можно оптимизировать ветку ANDROID и есть ли смысл (само собой без использования  step) ?

lowp vec2 my_step(lowp vec2 a, lowp vec2 b)
{
#ifdef ANDROID
  lowp vec2 r;
  r.x = a.x < b.x  ? 1.0 : 0.0;
  r.y = a.y < b.y  ? 1.0 : 0.0;
  return r;
#else
  return step(a, b);
#endif
}

#4
19:45, 16 ноя. 2016

min(_n, step(0.95f, _n));

#5
20:34, 16 ноя. 2016

Динамик бранч может тормозить (раньше точно тормозил, щас хз). Если использовать статик, то все ок. В паперах по д4 его хвалили, в отличии от пермутаций.

#6
21:45, 16 ноя. 2016

kipar WIN!
Для подобных задач используется step...

#7
22:45, 16 ноя. 2016

о,  спасибо! особенно за step.

#8
22:48, 16 ноя. 2016

kipar
> min(_n, step(0.95f, _n));
ну и вернет оно 0.96 для 0.96 а по условию задачи нужно 1.
То же что у Sergio:

n += step(0.950001, _n) * (1 - n)
#9
23:07, 16 ноя. 2016

max(_n, step(0.95, _n)); же

#10
23:14, 16 ноя. 2016

Раньше тормозило, поскольку выполнялись обе ветки, потом шло сравнение. Но уже несколько лет как это исправили. Можете использовать if без опаски.
А вот использовать что-то вроде color = mix(f1(),f2(),step()) как раз нежелательно. Там будут вычисляться оба значениа f1 и f2 и только потом выберется одно из значений.
В этом случае надо делать:
if(step())
  color = f1();
else
  color = f2();
Это будет в 2 раза быстрее.

#11
23:38, 16 ноя. 2016

san
> Раньше тормозило, поскольку выполнялись обе ветки, потом шло сравнение. Но уже
> несколько лет как это исправили.

А что исправили?
Как сейчас работает?

egoded
> if (_n > 0.95) _n = 1;

ALU инструкция, ничего конкретно в этом коде страшного нету.

#12
23:52, 16 ноя. 2016

Executor
> А что исправили?
> Как сейчас работает?
Сейчас шейдер сначала смотрит значение if, а уже потом идет по одной из веток. Раньше выполнялись обе ветки и только потом шло сравнение. Так делалось для того, что бы вычисление всех пикселей закончилось одновременно. Теперь железо стало умнее и может перекидывать свободные коры для помощи отстающим :)

#13
0:48, 17 ноя. 2016

наверное всё-таки отдельно взятый warp может закончить работу быстрее (если повезет) и взяться за другую работу, возможно даже другой шейдер

#14
6:25, 17 ноя. 2016

Ну и как же делать альфа-тест в WebGL без if ? :)

Страницы: 1 2 3 Следующая »
ПрограммированиеФорумГрафика

Тема в архиве.