Запустить буферный объект и изменить его данные с помощью шейдера?

Есть ли способ запустить шейдер на объекте буфера и изменить его с помощью других данных с помощью шейдера?

Другими словами: есть ли способ создать единую глобальную переменную в шейдере и модифицируемую?

4

Решение

Да, хотя это зависит от вашего оборудования. Все эти механизмы требуют аппаратного обеспечения, поддерживающего GL 3.x или выше.

Преобразование обратной связи

Это позволяет вам захватить результаты обработка вершин в одном или нескольких буферных объектах.

Это наиболее грубый механизм, потому что каждый вершинный шейдер может получить доступ только к тем данным вершины, которые он указан в качестве входных данных, и может записывать только в выходную вершину. Таким образом, шейдер не может получить доступ к вершине до или после нее. Кроме того, объем вывода довольно ограничен, обычно только 4 выходных значения от оборудования класса GL 3.x.

Вы могли бы использовать геометрический шейдер увеличить некоторые ваши навыки чтения и письма; обратная связь происходит после VS или GS.

Визуализация в буферный объект

Буферные текстуры текстуры, которые используют буферный объект для хранения. Они как действительно большие 1D текстуры.

Будучи текстурой, вы можете свободно прикрепить их к Объект Framebuffer и оказать ему.

Недостатком этого метода, помимо сложности рендеринга изображения с высотой 1 пиксель, является то, что вы имеете дело с растеризатором. Это не совсем точно. Ты можешь использовать gl_FragCoord знать, где вы находитесь во фрагменте, но если вы хотите записать существенно разные данные в разные области изображения, могут возникнуть трудности.

Другая проблема состоит в том, что размеры FBO ограничены размерами области просмотра, обычно около 8192-16384. Это не так много места для записи; в лучшем случае вы можете написать 65536 отдельных операций с плавающей запятой (если текстура буфера использует GL_RGBA32F формат). Таким образом, вы очень ограничены в том, сколько данных вы действительно можете написать.

Загрузка / хранение изображений

ARB_shader_image_load_store, Ядро в GL 4.2 представляет способность шейдера произвольно читать и записывать данные изображения. В сочетании с буферные текстуры (текстуры, которые используют буферные объекты в качестве хранилища), вы можете произвольно читать и записывать в буферные объекты.

Большим недостатком, помимо требований к оборудованию, является то, что нет бесплатного обеда. Используя Image Load Store, вы фактически отказываетесь от всех OpenGL системы автоматической синхронизации памяти. Так что вы должны сделать все синхронизации вручную для записи и чтения. Это большая боль, и вы можете очень легко облажаться и получить неопределенное поведение, не имея понятия, почему. Он может работать на одной платформе, но не на машине пользователя.

Вы должны быть очень осторожно с этим материалом.

Объект буфера хранилища шейдеров

Буферные объекты хранилища шейдеров на самом деле просто Image Load / Store из буферных текстур, только с много приятный интерфейс. Это похоже на определение структур и просто доступ к ним.

Применяются те же недостатки, что и для загрузки / сохранения изображений. Кроме того, SSBO является действительно новый; только NVIDIA реализует его, и даже тогда, только в бета-драйверах.

8

Другие решения

Я не слишком осведомлен о том, как именно это делается, но я знаю, что изменение VBO из шейдера называется Преобразование обратной связи. Вам понадобится OpenGL> = 3.0 или OpenGL> = 2.0 с NV_transform_feedback или же EXT_transform_feedback расширение.

Если вам нужна более общая вычислительная мощность, вы можете попробовать сделать некоторые OpenCL / OpenGL взаимодействие

1

По вопросам рекламы [email protected]