Производительность геометрических шейдеров GLSL неожиданно замедляется - PullRequest
1 голос
/ 12 марта 2012

Я пытаюсь научиться программировать шейдеры GLSL Geometry.Мой тестовый проект работает так: у меня есть N VBO, которые моделируют «травинки».Без шейдера каждая травинка - это просто линейная полоса с 20 сегментами.Я смог получить более или менее плавную анимацию с почти N = 10 000 лезвий, так что это 200 000 линий.

Шейдер берет каждый сегмент линии и выдувает его в цилиндр одинаковой длины с центром в этом сегменте линии.Таким образом, травинки теперь являются трубками с размерностью.Так что в процессоре ничего не изменилось, но сейчас я пытаюсь использовать графический процессор, чтобы добавить больше геометрии, чтобы можно было затенять лезвия.Цилиндр состоит из 30 секций, так что это 60 треугольников, 1200 треугольников на лезвие.

Дело в том, что для плавной анимации мне пришлось уменьшить масштаб только до 25 лезвий.Это всего лишь 30 000 треугольников, что по сути является МЕНЬШЕЙ геометрией, с которой я не имел дела раньше, когда я вообще не использовал шейдеры.

Это работает на Macbook Pro, Snow Leopard, AMD Radeon HD 6750M.Не знаю, хорошая это карта или нет.

Код шейдера довольно прост - у вершинного шейдера просто есть gl_Position = gl_Vertex.Освещение происходит в геометрическом шейдере: простые окружающие, зеркальные и рассеянные компоненты, в основном прямо из учебников.Фрагментный шейдер аналогично упрощен, просто умножает цвет травы на интенсивность света, которая была передана от геометрического шейдера.

Кстати, это старая версия OpenGL, 2.1 - так что это GLSL 1.2, поэтомучтобы использовать гео шейдер, ему нужна штука GL_EXT.В случае, если это уместно.

Кроме того, стек обрабатывает поверх GLGraphics поверх JOGL поверх Java.Я был бы удивлен, если бы это было фактором, если только каким-то образом он не эмулирует код шейдера на процессоре, но я не думал, что OpenGL сделает такие вещи автоматически для вас.

В любом случае, эти цифры кажутся разумнымиили я что-то не так делаю?Я не ожидаю, что гео шейдеры будут творить чудеса?

1 Ответ

5 голосов
/ 12 марта 2012

Никто никогда не обвинял Geometry Shaders в быстроте. Особенно при увеличении размера геометрии.

Ваш GS берет линию и не только выполняет 30-кратное усиление данных вершин, но также выполняет расчеты освещения для каждой из этих новых вершин. Это не будет очень быстро, во многом из-за отсутствия параллелизма. Каждый вызов GS должен выполнять 60 вычислений освещения, а не иметь 60 отдельных вызовов вершинных шейдеров, выполняющих 60 вычислений освещения параллельно.

Вы просто создаете гигантское узкое место в своем геометрическом шейдере.

Вероятно, было бы быстрее поместить осветительные приборы в фрагментный шейдер (да, действительно).

...