Шейдерный буферный объект медленный - альтернатива? - PullRequest
0 голосов
/ 22 мая 2019

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

Я протестировал передачу данных в виде объекта буфера хранилища шейдеров, объявленного как

layout(binding = 0) buffer voxels { vec3 xyz[]; }

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

Более того, когда я преобразую те же данные в код GLSL const vec3[] и включаю их в код шейдера, шейдерстановится заметно быстрее.

Есть ли лучший способ - быстрее, чем SSBO, и более элегантный, чем создание кода шейдера?

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

1 Ответ

1 голос
/ 22 мая 2019

Я бы порекомендовал использовать спецификатор макета std430 в SSBO, учитывая, что вы используете типы данных vec3, в противном случае вы будете вынуждены дополнить данные, что не очень хорошо. В общем, если буфер имеет фиксированный размер, предпочтительнее использовать glBufferSubData вместо glBufferData (последний может перераспределить память на GPU).

В качестве еще одной альтернативы, если вы можете использовать GL 4.4+, рассмотрите возможность использования glBufferStorage (или даже лучше, если GL4.5 доступен, используйте glCreateuffers и glNamedBufferStorage). Это позволит вам передать еще несколько подсказок драйверу GL о том, как будет использоваться буфер. Я бы попробовал несколько вариантов (например, отображение v.s. под-данных v.s. воссоздание каждый раз).

...