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

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

Страницы: 1 2 3 Следующая »
#15
10:15, 17 ноя. 2016

Ну напиши тернарный оператор если ифчиков боишься


#16
11:28, 17 ноя. 2016

egoded
> Поговаривают что "IF" шейдерах использовать крайне не желательно ибо тормозит.
Поговаривают, что не надо перевирать факты.
Потому что эта дезинформация потом разлетается, как грипп.

Во первых, не IF-ы, а ветвления (branch). Это разные вещи.
Во вторых, не тормозят, а медленнее арифметики. Где-то сильно медленнее, где-то не очень.

#17
12:56, 17 ноя. 2016

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

А где написано что всё работает именно так? В каких доках? Кинь пруфы.

#18
13:39, 17 ноя. 2016

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

Насколько я помню эту тему, пиксели обрабатываются группами. Если в этой группе пикселей исполнилась одна ветка, то ок. Если же какие-то из пикселей будут уходить в другую ветку, то будет пересчёт с учётом другой ветки, другими словами посчитается блок (или пиксели блока, которые не попали в предсказение?) дважды.
Хотелось бы подробнее почитать, если есть ссылка какая, то кинь пожалуйста.

#19
13:56, 17 ноя. 2016

Андрей5000
> max(_n, step(0.95, _n)); же
нет же

#20
14:13, 17 ноя. 2016

kipar
> min(_n, step(0.95f, _n));
_n будет 0 если меньше 0.95 и без изменений после.

#21
16:40, 17 ноя. 2016

А разве это не превратится всё в условное присваивание, без всяких веток? Что то вроде
cmp _n, 0.95f
movge _n, 1.0f
На gpu таких инструкций нет?

#22
17:02, 17 ноя. 2016

alorken
> На gpu таких инструкций нет?
Очень даже есть, ими и живем.

#23
17:58, 17 ноя. 2016

Андрей5000
> А где написано что всё работает именно так? В каких доках? Кинь пруфы.
Я регулярно пью пиво с ведущим разработчиком графики AMD (раньше ATI),  оттуда и информация. Да и сам я работаю в лавке Sulon Tech., моя область ответственности - низкоуровневое программирование графики для VR, так что перформанс это как раз мой хлеб. Но если сомневаешься, то легко можешь проверить - напиши шейдер с двумя тежелыми ветками и поставь if. Сравни время с ним и без него. Если где-то завалялся очень старый комп, то запусти тот же самый шейдер там. Опять сравни время. И будет тебе пруф.

#24
18:01, 17 ноя. 2016

san
> Я регулярно пью пиво с ведущим разработчиком графики AMD
Он не рассказывал часом, в чем проблема радеонов?

> Но если сомневаешься, то легко можешь проверить - напиши шейдер с двумя
> тежелыми ветками и поставь if. Сравни время с ним и без него.
Это ничего не докажет, кроме того, что бранчи стали работать быстрее.

#25
22:33, 17 ноя. 2016

san
> Раньше выполнялись обе ветки и только потом шло сравнение.
А пруфы будут? Насколько я знаю раньше сначала было сравнение, а потом в зависимости от ветки выставлялась маска на запись в регистры. Какой смысл в сравнении потом?

#26
3:38, 18 ноя. 2016

-Eugene-
> Это ничего не докажет, кроме того, что бранчи стали работать быстрее.
Еще раз: запусти две ветки друг за другом f1(),f2(), засеки время, потом запусти if(..) f1(); else f2(); засеки время. Во втором случае все выполнится в 2 раза быстрее. Что непонятного-то?
MrShoor
> Насколько я знаю раньше сначала было сравнение, а потом в зависимости от ветки выставлялась маска на запись в регистры. Какой смысл в сравнении потом?
Раньше выполнялись обе ветки, потом выбирался результат одной из них в зависимости от условия. Сейчас выполняется только одна ветка.

#27
5:11, 18 ноя. 2016

Можно обойтись и без if.

clamp(х*1.05, 0, 1)*0.95

как-то так.

#28
5:18, 18 ноя. 2016

san
> Я регулярно пью пиво

И я тоже. Даже на старых железках за счёт DFC можно было ускорить всякие там ray-cast/ early out  при фильтрации теней.
Про когерентность не слышал ?

#29
6:53, 18 ноя. 2016

dave
> Можно обойтись и без if.
> clamp(х*1.05, 0, 1)*0.95
> как-то так.
тебе в комнату к kipar'у и Андрей5000

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

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