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

Несколько материалов в одном шейдере - это выгодно? (2 стр)

Страницы: 1 2 3 Следующая »
#15
14:06, 26 сен. 2018

Durane
Так а чё ты стебёшься? Я понимаю что я дурак. Но не могу понять в чём. По-твоему, это не исправимо?
Т.е. я на форум за помощью пришёл, чтобы кто-то подсказал. Готов и хочу выслушать и принять мнение.
Или всё, кранты мне? Крест на мне можно ставить?


#16
14:08, 26 сен. 2018

Durane

условные проверки в шейдер

Где ты видел условия?

Вот такой код:

diffuseColor_ofMetall *= float(id_material == ID_METALL) * 0.2;

И вот такой:

if(id_material == ID_METALL) diffuseColor_ofMetall *= 0.2;

Дают разную нагрузку. Ты это понимаешь?

#17
14:10, 26 сен. 2018

Durane
В общем, на врядли ты мне сможешь помочь. Свободен короч.

#18
14:16, 26 сен. 2018

f1ufx_
> Свободен короч.
Серьезный поц.

#19
14:28, 26 сен. 2018

f1ufx_, короче. Блоки ветвления на гпу это плохо. Соответственно, вот это:
f1ufx_
> #define ID_METALL 1
> #define ID_PLASTIC 2
>
> int id_material = int(v_materialId);
>
> diffuseColor_ofMetall *= float(id_material == ID_METALL);
> diffuseColor_ofPlastic *= float(id_material == ID_POLISH);
>
> diffuseColor = diffuseColor_ofMetall + diffuseColor_ofPlastic;
Будет работать медленнее (при большом количестве объектов) чем если сделать по шейдеру для каждого материала. Я сам на эти грабли недавно наступил.

#20
14:29, 26 сен. 2018

f1ufx_
> Где ты видел условия?
vindast
> diffuseColor_ofMetall *= float(id_material == ID_METALL);
Вот это и есть условие.
То есть сначала проверяется ровно ли id_material  твоему ID_METALL, соответственно true или false, а затем он приводит к float (0.0 или 1.0).

#21
14:45, 26 сен. 2018

vindast

Вот это и есть условие.

Нет. Это операция сравнения и конвертация встроенных типов bool -> int -> float.
Условие это if.
Будет работать медленнее (при большом количестве объектов)

Ты хотел сказать "при большом количестве материалов"?
Да, есть такое. Я написал об этом в топик старте.

Потому и пришёл сюда с вопросом.

#22
14:46, 26 сен. 2018

vindast
На самом деле true или false это 0 или 1, который конвертируется во float. Ветвления там нет, там логический оператор, который, по сути, ничем от арифметического по сложности не отличается.

#23
21:21, 26 сен. 2018

филлрейт нивелирует оптимизацию по дравколлам + дравколлы более критичны для мобил, как и филлрейт :) ну и не забываем что приведения типов на шейдере занимает время

#24
21:25, 26 сен. 2018

на мобилках же нет DIP, чего вы фапаете на него? :)
Там же ваш любимый ОГЛ, который лишён такого недостатка как богомерзкий d3d

#25
21:42, 26 сен. 2018

f1ufx_
> diffuseColor_ofMetall *= float(id_material == ID_METALL);
> diffuseColor_ofPlastic *= float(id_material == ID_POLISH);
> diffuseColor = diffuseColor_ofMetall + diffuseColor_ofPlastic;

Такой фокус был бы выгоден на CPU, где за промахи предсказания ветвлений большие пенальти. А в GPU нормальная реализация этой логики через ветвление будет эквивалентна, т.к. вместо добавления нуля(или умножения на нуль) в случае с ветвллениями будет просто простой потока на время выполнения инструкции добавления (или умножения). Вот именно так смысла извращаться нет.

А вот если брать из массива по целочисленному индексу - то да, профит будет.

#26
15:00, 28 сен. 2018

vindast
> А почему бы не держать один шейдер на каждый материал? (Я один так делаю?)

Изображение

Вот почему.

И да, губят потанцевал не дравколы, губит потанцевал state change

#27
15:10, 28 сен. 2018

nonamezerox
> Вот почему.
И что ты предлагаешь? if-ами захерачить? Больше 100 шейдеров в одном кадре вообще не представляю, укладываюсь пока в 25 (+-).


#28
15:39, 28 сен. 2018

nonamezerox
Есть крупные движки где используется хотя бы батчинг, не говоря об упаковке N-материалов в 1 шейдер? Насколько я знаю, в UnrealEngine4 нет ни того, ни другого, в Unity3D есть батчинг. Под использованием имеется ввиду намек на такой подход на всех уровнях архитектуры движка, а не возможность на него перейти, но так что это будет выглядеть сбоку бантиком.

#29
17:18, 28 сен. 2018

nonamezerox

это же про десктопы

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

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