Durane
Так а чё ты стебёшься? Я понимаю что я дурак. Но не могу понять в чём. По-твоему, это не исправимо?
Т.е. я на форум за помощью пришёл, чтобы кто-то подсказал. Готов и хочу выслушать и принять мнение.
Или всё, кранты мне? Крест на мне можно ставить?
Durane
Где ты видел условия?
Вот такой код:
diffuseColor_ofMetall *= float(id_material == ID_METALL) * 0.2;
И вот такой:
if(id_material == ID_METALL) diffuseColor_ofMetall *= 0.2;
Дают разную нагрузку. Ты это понимаешь?
Durane
В общем, на врядли ты мне сможешь помочь. Свободен короч.
f1ufx_
> Свободен короч.
Серьезный поц.
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;
Будет работать медленнее (при большом количестве объектов) чем если сделать по шейдеру для каждого материала. Я сам на эти грабли недавно наступил.
f1ufx_
> Где ты видел условия?
vindast
> diffuseColor_ofMetall *= float(id_material == ID_METALL);
Вот это и есть условие.
То есть сначала проверяется ровно ли id_material твоему ID_METALL, соответственно true или false, а затем он приводит к float (0.0 или 1.0).
vindast
Потому и пришёл сюда с вопросом.
vindast
На самом деле true или false это 0 или 1, который конвертируется во float. Ветвления там нет, там логический оператор, который, по сути, ничем от арифметического по сложности не отличается.
филлрейт нивелирует оптимизацию по дравколлам + дравколлы более критичны для мобил, как и филлрейт :) ну и не забываем что приведения типов на шейдере занимает время
на мобилках же нет DIP, чего вы фапаете на него? :)
Там же ваш любимый ОГЛ, который лишён такого недостатка как богомерзкий d3d
f1ufx_
> diffuseColor_ofMetall *= float(id_material == ID_METALL);
> diffuseColor_ofPlastic *= float(id_material == ID_POLISH);
> diffuseColor = diffuseColor_ofMetall + diffuseColor_ofPlastic;
Такой фокус был бы выгоден на CPU, где за промахи предсказания ветвлений большие пенальти. А в GPU нормальная реализация этой логики через ветвление будет эквивалентна, т.к. вместо добавления нуля(или умножения на нуль) в случае с ветвллениями будет просто простой потока на время выполнения инструкции добавления (или умножения). Вот именно так смысла извращаться нет.
А вот если брать из массива по целочисленному индексу - то да, профит будет.
vindast
> А почему бы не держать один шейдер на каждый материал? (Я один так делаю?)
Вот почему.
И да, губят потанцевал не дравколы, губит потанцевал state change
nonamezerox
> Вот почему.
И что ты предлагаешь? if-ами захерачить? Больше 100 шейдеров в одном кадре вообще не представляю, укладываюсь пока в 25 (+-).
nonamezerox
Есть крупные движки где используется хотя бы батчинг, не говоря об упаковке N-материалов в 1 шейдер? Насколько я знаю, в UnrealEngine4 нет ни того, ни другого, в Unity3D есть батчинг. Под использованием имеется ввиду намек на такой подход на всех уровнях архитектуры движка, а не возможность на него перейти, но так что это будет выглядеть сбоку бантиком.
nonamezerox
это же про десктопы
Тема в архиве.