Форум программистов, компьютерный форум, киберфорум
Наши страницы
OpenGL
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 5.00/9: Рейтинг темы: голосов - 9, средняя оценка - 5.00
Igor3D
1229 / 596 / 74
Регистрация: 01.10.2012
Сообщений: 2,844
1

GLSL - катастрофически медленно

24.03.2013, 12:17. Просмотров 1690. Ответов 22
Метки нет (Все метки)

Здравствуйте

С год назад написал большой (25K) GLSL шейдер. Ну понятно для phong render (насколько я знаю иначе никак) + поддержка до 8 текстур и до 8 источников света. Конечно что это ужасно медленно я знал и год назад, но после приключений с одной картой (хз где юзверь ее выдрал) у меня уже не было никаких сил чего-то ускорять. Сейчас, "поостыв" вернулся к проблеме и вчера сделал серию тестов.

Примечание: я в курсе что GLSL грузит карту даже при "неактивном" коде, напр
C++
1
2
3
4
5
6
if (i < 1) {
 ...
}
else {
  DoSomethingBig();
}
Нормальный человек думает что если у него i i = 0, то DoSomethingBig никогда не выполнится. Ни фига, DoSomethingBig грузит карту все равно. Это конечно капитально бьет по ушам. Поэтому все тесты ниже сделаны с полной вырезкой кода

14 fps без шейдера
2 fps с шейдером
11 fps Холостой ход: шейдер обращается ко всем uniform (иначе нельзя) но ничего не делает
3 fps Одна текстура вместо 8
4 fps без текстур
4-5-6 fps без текстур и без тех или иных атрибутов материала
8 fps - без материала вообще (но с источниками света)

Примечание: "текстура" подразумевается только код в шейдере, объекты рендерятся без текстур. Пока я не вижу явных "узких мест". Буду рад услышать советы. А если есть желание ускорить шейдер за деньги - пишите в личку.

С уважением
Игорь
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.03.2013, 12:17
Ответы с готовыми решениями:

Освещение (GLSL)
Я пытаюсь сделать шейдер на GLSL, поддерживающий большое количество источников света. Вычислить...

Glsl sampler2D
При отрисовке текстур через шейдер пишут: glBindTexture(GL_TEXTURE_2D, texture_id);...

Освещение GLSL
Здравствуйте,форумчане!:) Речь пойдёт о самом просто диффузном освещении через GLSL. Как...

Шейдеры GLSL
Давайте в этой теме выкладывать личный опыт применения шейдеров, может быть таким образом в разделе...

с++ OpenGL GLSL
Игрался я с OpenGL и захотелось мне попробывать GLSL шейдеры, но столкнулся с небольшой проблемкой....

22
_Develop
295 / 188 / 32
Регистрация: 24.01.2013
Сообщений: 556
24.03.2013, 12:36 2
В современных видеокартах (даже на встроенных говноинтелах) уже нету FFP (fixed function pipelline).
Это значит, что если Вы не используете шейдеры, то их сгенерит для видеокарты сам драйвер (делаем
вывод о эффективности Ваших шейдеров ).

Читайте доки по оптимизации от вендоров, в частности по Dynamic Branches в шейдерах,
а вообще судя по обилию Ваших вопросов на форуме связанных с OpenGL, наверное пора искать
специалиста в данной области, если конечно Ваше приложение стоит того, что бы в него вкладывать деньги
0
Igor3D
1229 / 596 / 74
Регистрация: 01.10.2012
Сообщений: 2,844
24.03.2013, 13:29  [ТС] 3
Цитата Сообщение от _Develop Посмотреть сообщение
В современных видеокартах (даже на встроенных говноинтелах) уже нету FFP (fixed function pipelline).
Это значит, что если Вы не используете шейдеры, то их сгенерит для видеокарты сам драйвер (делаем
вывод о эффективности Ваших шейдеров ).
То есть я могу получить phong shading не написав никаких GLSL шейдеров? Никогда не слышал о такой возможности, если нетрудно, киньте ссылочку. Также неясно откуда карта узнает о моих параметрах материала, источниках света и многом другом.

Цитата Сообщение от _Develop Посмотреть сообщение
Читайте доки по оптимизации от вендоров, в частности по Dynamic Branches в шейдерах,
а вообще судя по обилию Ваших вопросов на форуме связанных с OpenGL, наверное пора искать
специалиста в данной области, если конечно Ваше приложение стоит того, что бы в него вкладывать деньги
Этот вариант вполне возможен, о чем я и сказал в своем предыдущем посте. Я занимаюсь OpenGL иногда/редко (ну без превью не прожить), поэтому есть смысл нанять кого-то. Но не все так просто - OpenGL тесно переплетен с приложением, напр в мой phong shading человеку придется вникать не один день. Во-вторых, увы, "железячники" которых я встречал - программеры слабенькие, видать вся силенка ушла в изучение железа. Все вроде хорошо как изображать "фыркание знатока", а когда доходит до дела - остается прослезиться Возможно мне просто пока не везло
0
snake32
1842 / 1154 / 203
Регистрация: 26.02.2009
Сообщений: 4,316
Записей в блоге: 5
24.03.2013, 13:56 4
Igor3D, я так понял что шейдер у вас один на все случаи жизни? Думаю, тогда лучше разбить его на несколько. И подгружать нужные. Любые условия/циклы внутри шейдера значительно просаживают производительность GPU.
0
24.03.2013, 13:56
_Develop
295 / 188 / 32
Регистрация: 24.01.2013
Сообщений: 556
24.03.2013, 14:08 5
Вероятнее всего там жестокий убершейдер в лучшем стиле С++ писак
и судя по всему целевое железо довольно слабенькое, а убершейдер не каждый топ нормально потянет.
Хотя освещение Блинна-Фонга само по себе довольно простое.

Добавлено через 3 минуты
Цитата Сообщение от Igor3D Посмотреть сообщение
То есть я могу получить phong shading не написав никаких GLSL шейдеров? Никогда не слышал о такой возможности, если нетрудно, киньте ссылочку. Также неясно откуда карта узнает о моих параметрах материала, источниках света и многом другом.
извините, но у Вас отсутствуют элементарные познания в данном вопросе.
0
Igor3D
1229 / 596 / 74
Регистрация: 01.10.2012
Сообщений: 2,844
24.03.2013, 14:28  [ТС] 6
Цитата Сообщение от snake32 Посмотреть сообщение
Igor3D, я так понял что шейдер у вас один на все случаи жизни? Думаю, тогда лучше разбить его на несколько. И подгружать нужные. Любые условия/циклы внутри шейдера значительно просаживают производительность GPU.
В курсе, но убирать if'ы - работа большая, разбивать на неск - тоже. Во я и пытаюсь сначала прикинуть что я с этого буду иметь, убирая ветки. Пока мрачно

Цитата Сообщение от _Develop Посмотреть сообщение
Вероятнее всего там жестокий убершейдер в лучшем стиле С++ писак
и судя по всему целевое железо довольно слабенькое, а убершейдер не каждый топ нормально потянет.
Хотя освещение Блинна-Фонга само по себе довольно простое.
..
извините, но у Вас отсутствуют элементарные познания в данном вопросе.
Да может и отсутствуют - я к этому спокойно отношусь и все(за)знайку из себя не строю Целевое железо не выбираю - у разных пользователей разное. Да, 1 шейдер на все - про все. Прежде чем начинать "оптимизацию под GLSL" мне хотелось бы кое-что понять.

Пример: у меня здоровенный кусок кода для blend'ов текстур (все режимы фотошопа с конверторами в HSV<->RGB). Почему если я его полностью вырезаю - никакого ощутимого прироста не наблюдается? Хотя код чуть ли не вдвое меньше.
0
_Develop
295 / 188 / 32
Регистрация: 24.01.2013
Сообщений: 556
24.03.2013, 14:50 7
Вот нагуглил по модели освещения в OpenGL: http://www.google.com.ua/url?q=http:...R6L63xUc5DHjKQ
By default, OpenGL's fixed-function
pipeline implements the Blinn-Phong
Shading Model.
P.S. тоже не строю из себя всезнайку. Просто ответил на вопрос.
0
Igor3D
1229 / 596 / 74
Регистрация: 01.10.2012
Сообщений: 2,844
24.03.2013, 15:18  [ТС] 8
Цитата Сообщение от _Develop Посмотреть сообщение
Вот нагуглил по модели освещения в OpenGL: http://www.google.com.ua/url?q=http:...R6L63xUc5DHjKQ
Я имел ввиду простой вещь: без шейдера освещенность (напр specular) будет просто интерполироваться по вертексам (тот же gourand). Если это не так - пожалуйста поправьте. Хотя все равно обойтись без шейдера не выходит - есть немало опций материала которым нет прямого соответствия в OpenGL и кроме шейдера делать их нечем. Резать ф-ционал как-то неинтересно, что это тогда за phong preview, для скорости есть gourand.
0
_Develop
295 / 188 / 32
Регистрация: 24.01.2013
Сообщений: 556
24.03.2013, 15:27 9
я сам предпочитаю работать с шейдерами, а комментируя Ваши слова:
Цитата Сообщение от Igor3D Посмотреть сообщение
14 fps без шейдера
2 fps с шейдером
...
я хотел сказать, что и в случае "14 fps без шейдера" рендер будет производиться с шейдером, который подставит драйвер.
0
Igor3D
1229 / 596 / 74
Регистрация: 01.10.2012
Сообщений: 2,844
25.03.2013, 10:15  [ТС] 10
Хорошо, вернемся к теме. Часто встречается рекомендация типа "используйте 2 или более шейдеров". Действительно, многие uniform просто "флаги" и могут быть расписаны через #ifdef. Но прикинем число вариантов: до 8 источников света + до 8 текстур. Пусть практически их меньше - все равно десятки разных шейдеров. Компилить их на лету, по мере необходимости - это удовольствие дорогое, у меня на одной машине шейдер компилится/линкуется по меньшей мере секунд 5 (GeForce 8600)

Как быть?
0
NoMasters
Псевдослучайный
1919 / 1124 / 91
Регистрация: 13.09.2011
Сообщений: 3,188
25.03.2013, 17:05 11
Ну так можно же предварительно скомпилять.
0
Igor3D
1229 / 596 / 74
Регистрация: 01.10.2012
Сообщений: 2,844
25.03.2013, 17:19  [ТС] 12
Цитата Сообщение от NoMasters Посмотреть сообщение
Ну так можно же предварительно скомпилять.
"Предварительно" - это когда? До запуска приложения - разве так можно? А "сразу после запуска" (напр на splah) кого компилять, все возможные? Так это может растянуться на десятки минут

Еще раз напомню: с OpenGL я работаю редко, поэтому не стесняйтесь поправлять если я не курсе чего-то
0
snake32
1842 / 1154 / 203
Регистрация: 26.02.2009
Сообщений: 4,316
Записей в блоге: 5
25.03.2013, 17:30 13
Цитата Сообщение от Igor3D Посмотреть сообщение
Так это может растянуться на десятки минут
Что-то вы загнули. Полосочку загрузки приложения сделайте наконец. За то вся остальная работа будет быстрее. Нужно будет только биндить нужный программный объект.

Как вариант, но более сложный, компилить только те которые нужны в данный момент и кэшировать их. Чтобы исключить лишние перекомпиляции.
0
Igor3D
1229 / 596 / 74
Регистрация: 01.10.2012
Сообщений: 2,844
25.03.2013, 17:45  [ТС] 14
Цитата Сообщение от snake32 Посмотреть сообщение
Что-то вы загнули. Полосочку загрузки приложения сделайте наконец.
На данный момент число if'ов в шейдере = 148. Даже со всеми допущениями число вариантов столь велико что полосочка вряд ли успокоит юзверя

Цитата Сообщение от snake32 Посмотреть сообщение
Как вариант, но более сложный, компилить только те которые нужны в данный момент и кэшировать их. Чтобы исключить лишние перекомпиляции.
Разумно, но придется как-то объяснять паузу/заморозку UI на неск секунд (и больше) нужных для компиляции возникшего расклада. Причем здесь даже и полосочку не показать - заморожена главная нитка.

В общем пока рекомендация "разбивать не несколько" не кажется мне серьезной (так "мелочь по карманам тырить")
0
snake32
1842 / 1154 / 203
Регистрация: 26.02.2009
Сообщений: 4,316
Записей в блоге: 5
25.03.2013, 18:12 15
Цитата Сообщение от Igor3D Посмотреть сообщение
Даже со всеми допущениями число вариантов столь велико что полосочка вряд ли успокоит юзверя
Не верю я. Вы не забывайте что компилить шейдер 150 строк это не тоже самое что и компилить шейдер 25000 строк. Думаю, общее время компиляции 150 шейдеров по 150 строк будет не на много больше чем один шейдер-переросток-мутант... хотя могу ошибаться. Но скорость отрисовки должна значительно вырасти. Спросите на геймдеве.
Цитата Сообщение от Igor3D Посмотреть сообщение
так "мелочь по карманам тырить"
Курочка по зёрнышку клюёт

Вообщем, я понял, лень - нифига не двигатель прогресса
0
Igor3D
1229 / 596 / 74
Регистрация: 01.10.2012
Сообщений: 2,844
25.03.2013, 18:34  [ТС] 16
Цитата Сообщение от snake32 Посмотреть сообщение
Не верю я. Вы не забывайте что компилить шейдер 150 строк это не тоже самое что и компилить шейдер 25000 строк. Думаю, общее время компиляции 150 шейдеров по 150 строк будет не на много больше чем один шейдер-переросток-мутант... хотя могу ошибаться. Но скорость отрисовки должна значительно вырасти. Спросите на геймдеве.
Как правило - там столь же общие/стандартные ответы Ну 150 - это еще туда-сюда, но там ведь пахнет как минимум на порядок больше. И что делать? Оставить часть if'ов - так скорее всего я ничего не получу (см статистику в первом посте)

Цитата Сообщение от snake32 Посмотреть сообщение
Вообщем, я понял, лень - нифига не двигатель прогресса
Двигатель-двигатель А чего тупо следовать рекомендациям если здравый смысл говорит что они здесь не в масть? Зачем изображать "кипучую деятельность"? Лучше курить и слушать старый Van Der Graaf - время покажет.
0
snake32
1842 / 1154 / 203
Регистрация: 26.02.2009
Сообщений: 4,316
Записей в блоге: 5
25.03.2013, 19:34 17
Цитата Сообщение от Igor3D Посмотреть сообщение
Ну 150 - это еще туда-сюда, но там ведь пахнет как минимум на порядок больше. И что делать? Оставить часть if'ов - так скорее всего я ничего не получу (см статистику в первом посте)
Смотрю статистику.
14 fps без шейдера
11 fps Холостой ход: шейдер обращается ко всем uniform (иначе нельзя) но ничего не делает
Что-то не то... Даже холостой ход сливает фиксированному конвейеру(с полным функционалом). Может вы как-то не правильно обращаетесь к юниформам? Можно запустить действительно пустой шейдер без юнифрмов? Тогда станет ясно где собака зарыта.
Цитата Сообщение от Igor3D Посмотреть сообщение
здравый смысл говорит
Ну раз говорит пойду и я бахну и включу Paul Van Dyk
Цитата Сообщение от Igor3D Посмотреть сообщение
- время покажет
Кстати, как оно может показать если ничего не делать?
0
Igor3D
1229 / 596 / 74
Регистрация: 01.10.2012
Сообщений: 2,844
25.03.2013, 20:08  [ТС] 18
Цитата Сообщение от snake32 Посмотреть сообщение
Что-то не то... Даже холостой ход сливает фиксированному конвейеру(с полным функционалом). Может вы как-то не правильно обращаетесь к юниформам? Можно запустить действительно пустой шейдер без юнифрмов? Тогда станет ясно где собака зарыта.
Ну таким холостым ходом (14/11) я вполне удовлетворен - ведь без шейдера освещенность и цвет просто интерполируются по вертексам, а с шейдером как-никак да все ж каждую точку считаем. Это норм. Ну отключу юниформы, что дальше без них?

Цитата Сообщение от snake32 Посмотреть сообщение
Ну раз говорит пойду и я бахну и включу Paul Van Dyk
Эх, молодежжжжь..

Цитата Сообщение от snake32 Посмотреть сообщение
Кстати, как оно может показать если ничего не делать?
Сиди спокойно на берегу реки, и мимо проплывет труп твоего врага.
Парадоксально, но часто бездеятельность - лучший путь. Пощупав эту тему год спустя (в частности и на этом форуме) я вижу что ничего реального по-прежнему нет - ну я никуда не тороплюсь.

Всем спасибо за ответы - и конечно у каждого свой подход/метод (это нормально)
0
snake32
1842 / 1154 / 203
Регистрация: 26.02.2009
Сообщений: 4,316
Записей в блоге: 5
25.03.2013, 20:46 19
Цитата Сообщение от Igor3D Посмотреть сообщение
а с шейдером как-никак да все ж каждую точку считаем. Это норм.
Какой же это норм? Что фиксированный пиксели не красит? А этот вообще ничего не делает. Как по мне так вообще не норм.
Цитата Сообщение от Igor3D Посмотреть сообщение
Ну отключу юниформы, что дальше без них?
Может их ко-во влияет на фпс?
Цитата Сообщение от Igor3D Посмотреть сообщение
Всем спасибо за ответы
Ну... вообщем, я понял, будем ждать
0
Герц
526 / 343 / 12
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
25.03.2013, 21:26 20
Любые поиски узких мест и оптимизации уместны лишь при применении профилировщика, иначе это гадание на кофейной гуще.
1
25.03.2013, 21:26
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.03.2013, 21:26

Рисование на примитивах в GLSL
Можно ли с помощью шейдеров рисовать непосредственно на примитиве(по пиксельно или float-ом)?

Подскажите букварь по GLSL
Собственно сабж. Помогите пожалуйста. А то все что нарыл в инете не пашет. Вот здесь букварь по...

Smooth средствами glsl
Решил сделать smooth линии, начал с точки. Взял полигон на весь экран, послал uniform координату...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru