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

Непонимание шейдеров

Страницы: 1 2 3 4 Следующая »
#0
20:11, 9 фев. 2011

Очень прошу сильно не кидаться, просто сколько не пытался по гуглу и книгам найти ответы на свои вопросы, так и не получилось. Так как шейдеры изучал в очень ускоренном темпе, образовалось большое кол-во пробелов, которые хотел бы заполнить.

Итак проблема в следующем: при включении шейдеров, возврата к фиксированому функционалу уже нет, однако есть вещи для которых он очень удобен.
Пример:
ShaderProblem | Непонимание шейдеров
На рисунке красным обведено, то место где мне нужны шейдеры (модель Кука-Торенса), а синим где хватит фиксированного функционала (там просто вывод текста и линий). Однако то что выделенно синим тоже приходится делать через шейдеры, причем в этом месте мне вообще не нужно освещение. Сейчас проблему решаю так: завожу в шейдере uniform переменную TypeRender и при выводе модели приравниваю ее 1, а при выводе осей 0

void main()
{
  if (TypeRender == 1)
  {
    //Использую кука-торенса
  }
  else
  {
    //Рисование цвета как он есть 
    gl_FrontColor = gl_Color;
  }
}

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


#1
20:14, 9 фев. 2011

У меня в этом случае используются два РАЗНЫХ шейдера: один для графика, другой для текста. (Ещё есть третий для постпроцесса.)
P.S. А ничего так выглядит, рельеф хорошо читаем. Какая техника для самого графика? Похоже на AO.

#2
20:19, 9 фев. 2011

Вот так отключаются шейдеры.

glUseProgramObjectARB(0);

#3
20:29, 9 фев. 2011

Снаут
Т.е. мы создаем, компилим и линкуем несколько шейдеров, а потом просто в нужных местах вызываем glUseProgramObjectARB(нужная программа); ? Я думал насчет этого варианта, и он весьма мне понравился, единственное что меня смутило, что в книге по которой я все изучал писалось, что обычно используется только по одному экземпляру вершинного и фрагментного шейдера. А переключение между программами шейдеров быстро происходит?

Да там все элементарно: усредненные по площади нормали и модель освещения Кука-Торенса. Есть еще тени через карту теней, но они здесь выключены.

#4
20:31, 9 фев. 2011

smt005
О спасибо, что то я этого нигде не находил. Что бы вернутся к фиксированному функционалу мне приходилось (о ужас) грохать контекст и создавать его заново :( А вообще правильно ли постоянно переключаться между между шейдерами и фиксированным?

Снаут
AO в процессе прикручивания, но еще не готов.

#5
20:41, 9 фев. 2011

pascal.ilya
Я делаю так, не умер. Насколько знаю, все остальные тоже делают так и не умерли.
pascal.ilya
> А переключение между программами шейдеров быстро происходит?
В GL - не знаю.  В DX - по сравнению со временем рендеринга такой поверхности время переключения будет незаметно.
pascal.ilya
> правильно ли постоянно переключаться между между шейдерами и фиксированным?
FFP не нужен вообще. Он сейчас эмулируется через шейдеры, а в новых GAPI его нет совсем.

Так это твоя картинка? Мне она местами больше нравится, чем моя.

#6
20:44, 9 фев. 2011

pascal.ilya
> А переключение между программами шейдеров быстро происходит?
Медленно. Боьше одного раза за кадр один и тот же шейдер не вырубай, ежели конечно не прижопило тебя, что ппц как надо.

#7
20:51, 9 фев. 2011

Снаут
Понял, спасибо. Сейчас буду разделять щейдеры и делать переключение между ними. Да я слышал что FFP уже себя изжил, однако совсем от него отказываться я не хочу по той причине, что программа может запускаться на старых видюхах. При старте (или по желанию пользователя) программа выбирает использовать ей FFP или шейдеры. Да, картинка моя.

#8
21:33, 9 фев. 2011

Можно смело порядка 2000-5000 раз за кадр переключать с полной загрузкой юниформов и т.д.
FFP лучше убрать совсем, потому что с ним код превратится в такую кашу, что в нём невозможно будет разобраться.

#9
21:53, 9 фев. 2011

-Eugene-
> Медленно. Боьше одного раза за кадр один и тот же шейдер не вырубай, ежели
> конечно не прижопило тебя, что ппц как надо.
Петросян.жпг Человек дельный вопрос задает, а ты тут тонко "шутишь", зачем так?

#10
21:57, 9 фев. 2011

pascal.ilya
> А переключение между программами шейдеров быстро происходит?
Довольно быстро, уж на два то шейдера хватит за глаза, в некоторых программах они сотнями за кадр переключаются и ничего, бегает :)

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

> А вообще правильно ли постоянно переключаться между между шейдерами и фиксированным?
Это делать можно, но лучше так не делать, ибо смысла в этом никакого нету, да и не принято мешать как-то.

#11
9:29, 10 фев. 2011

pascal.ilya
> то место где мне нужны шейдеры (модель Кука-Торенса),

А зачем при таком раскладе именно Кук ? Там разницы с Блинн-Фонгом не будет особой

#12
9:51, 10 фев. 2011

pascal.ilya
> Однако как я слышал констрункции if-else сильно убивают производительность.
Во-первых, несравнимо меньше, чем вызовы функций (кстати, производительность убивает даже команда nop, которая, как известно, ничего не делает).
Во-вторых, очень редко можно предугадать, где "слабое место" в программе в плане производительности.
Поэтому лучшее правило : преждевременная оптимизация - зло.

#13
10:16, 10 фев. 2011

KpeHDeJIb
>
> Петросян.жпг Человек дельный вопрос задает, а ты тут тонко "шутишь", зачем так?
Причем тут шутки? Если менять шейдеры перед каждым ДИП-ом производительность ткнется в ноль....

#14
10:46, 10 фев. 2011

-Eugene-
> Если менять шейдеры перед каждым ДИП-ом производительность ткнется в ноль....
Простите, но что значит менять шейдеры перед каждым дипом? В OpenGL как установка стейтов так и дипы сами по себе дешевые, а вот перекомпиляция шейдеров, да еще больших, вполне может быть весьма тяжелой. Вобщем - пруф или не было!

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

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