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

Непонимание шейдеров (3 стр)

Страницы: 1 2 3 4 Следующая »
#30
14:39, 10 фев. 2011

Спасибо за ссылки, обязательно ознакомлюсь.

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


#31
14:44, 10 фев. 2011

pascal.ilya
> Для чего она нужна и нужна ли вообще?
нужна для режима отладки

#32
15:36, 10 фев. 2011

pascal.ilya
> Для чего она нужна и нужна ли вообще?
В дебаге нужна, в релизе не делать.

> У меня вроде и без нее если ошибки есть, то пишутся.
А ты почитай что она делает, она интересные вещи проверяет, не ошибки.

#33
16:52, 10 фев. 2011

Растащил все модели освещения по разным шейдерам. Данный подход мне очень понравился, как то и логичнее, и код понятнее, и стало заметно быстрее работать.

Но теперь следующая проблема. У меня есть тени через шедоумап. Они могут быть включены, а могут быть выключены. Соответственно раньше я использовал тот же подход с переменной, что и для выбора модели освещения. А сейчас хотелось бы полностью уйти от всех этих if-ов.

Получается что я включаю шейдер с какой то моделью освещения. Он рассчитывает цвет каждого пикселя. А как мне по-необходимости включить шейдер с тенями который посмотрим есть ли тень в этом месте и соответствующим образом изменит цвет пикселя.

Т.е. у меня сейчас

if NTCanvas.FLight.LightModel = 1 then
  NTCanvas.CookTorranceShader.UseShader
else if NTCanvas.FLight.LightModel = 2 then
  NTCanvas.AshikhminShirleyShader.UseShader
else if NTCanvas.FLight.LightModel = 3 then
  NTCanvas.WardAnisotropicShader.UseShader
else
  NTCanvas.PhongShader.UseShader;

DrawModel;

И куда то мне надо добавить NTCanvas.Shadow.UseShader; Если я это сделаю до отрисовки модели не сработает шейдер освещения. Если после, то шейдер теней не окажет никакого влияния. Как правильно организовать подобные вещи? Всем спасибо!

#34
17:17, 10 фев. 2011

О набрел на описание подобных вещей через дефайны. Т.е. в моем случае можно задефайнить использование теней и в случае переключения влючены-выключены просто перекомпилировать шейдеры. Правильно ли так делать?

#35
17:34, 10 фев. 2011

pascal.ilya
> Правильно ли так делать?
Не очень, есть два варианта:
1. Использовать разные шейдеры для рендера с тенью и без.
2. Сделать все тот же if, только без else, тогда не будет динамического ветвления, просто conditional execute.

#36
17:40, 10 фев. 2011

KpeHDeJIb
> Не очень, есть два варианта:
> 1. Использовать разные шейдеры для рендера с тенью и без.
> 2. Сделать все тот же if, только без else, тогда не будет динамического
> ветвления, просто conditional execute.

Первый вариант к сожалению не подойдет, т.к. кроме теней будут и еще эффекты которые можно будет включать/выключать. Тогда походу придется делать по варианту 2.

Было еще упоминание о том что в одну программу можно включить несколько пиксельных шейдеров. Как они взаимодействуют друг с другом? Можно ли это использовать для данной задачи?

З.Ы. Время перекомпиляции шейдера во время включения/выключения эффекта меня не волнует, главное что бы уж не слишком долго.

#37
17:44, 10 фев. 2011

pascal.ilya
> Как они взаимодействуют друг с другом? Можно ли это использовать для данной
> задачи?
int a,b;
как a взаимодействует с b?

pascal.ilya
> З.Ы. Время перекомпиляции шейдера во время включения/выключения эффекта меня не
> волнует, главное что бы уж не слишком долго.
Долго - понятие растяжимое.

#38
17:46, 10 фев. 2011

-Eugene-
> int a,b;
> как a взаимодействует с b?
Наверно я неправильно сформулировал вопрос. Я имел ввиду не может ли пиксельный шейдер b получить доступ к итоговому результату шейдера а, после того как он все выполнит? Это в случае когда они приатачены к одной шейдерной программе.

#39
17:51, 10 фев. 2011

pascal.ilya
> Это в случае когда они приатачены к одной шейдерной программе.
А такое можно? Если да, то может лучше так не делать?

#40
17:52, 10 фев. 2011

pascal.ilya
> Это в случае когда они приатачены к одной шейдерной программе.
До версии OpenGL 4 нет, кажется только в ней появились цепочки шейдеров, могу ошибаться, может еще и не появились а только рассматривались. Разве только screen-space эффекты какие-то, но это видимо не то что тебе надо.

> Тогда походу придется делать по варианту 2.
Вариант 2 не такой уж плохой, если с умом подойти, ну я писал про contidional execution, почитай про это.

#41
17:52, 10 фев. 2011

Sasha7b9
> > Однако как я слышал констрункции if-else сильно убивают производительность.
> Во-первых, несравнимо меньше, чем вызовы функций (кстати, производительность
> убивает даже команда nop, которая, как известно, ничего не делает).
Где ты видел вызовы функций в GPU? В GPU нет стека команд и нет вызовов функций, они все inline. А вот ветвления, если они меняют код, а не данные, то ОЧЕНЬ сильно бьют по производительности. На картах AMD от ветвлений производительность снижается до 16 раз из-за расхождения вейвфронт, а на NVidia - до 8 раз. То есть до 8-16 раз можешь просадить скорость вызовами if-else, в то время как "вызовы функций" абсолютно бесплатны всегда, так как они все inline.

#42
17:53, 10 фев. 2011

pascal.ilya
Рендерь в текстуру и получай результат.

#43
18:00, 10 фев. 2011

pascal.ilya
> Еще тут небольшой вопрос назрел. Я где то читал что валидация шейдеров
> (glValidateProgram) необязательна и даже несколько их тормозит. Для чего она
> нужна и нужна ли вообще? У меня вроде и без нее если ошибки есть, то пишутся.
Делай валидацию после линковки шейдера и задания всех констант. Что-то в этом роде:
1) Сборка программы из компилированных шейдеров.
2) Задание адресов аттрибутов вершин и выходных переменных фрагментного шейдера (если надо).
3) Линковка.
4) Включаем шейдер.
5) Задание постоянных uniform-переменных, которые ты не будешь никогда менять, например текстурные семплеры и линки UBO.
6) Валидация шейдера.
7) Читаем лог шейдера.
8) Выключаем шейдер.
Когда шейдер используешь, то уже просто:
1) Включаем.
2) Задаём юниформы (матрица, лампочки, параметры материала и т.д.).
3) Рисуем.

#44
18:45, 10 фев. 2011

SNVampyre
Виноват, поумничать решил)

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

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