Запустить буферный объект и изменить его данные с помощью шейдера?
Есть ли способ запустить шейдер на объекте буфера и изменить его с помощью других данных с помощью шейдера?
Другими словами: есть ли способ создать единую глобальную переменную в шейдере и модифицируемую?
2 ответа
Да, хотя это зависит от вашего оборудования. Все эти механизмы требуют аппаратного обеспечения, поддерживающего 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 реализует его, и даже тогда, только в бета-драйверах.
Я не слишком осведомлен о том, как именно это делается, но я знаю, что изменение VBO из шейдера называется Transform Feedback. Вам понадобится OpenGL >=3.0 или OpenGL >= 2.0 с NV_transform_feedback
или же EXT_transform_feedback
расширение.
Если вам нужна более общая вычислительная мощность, вы можете попробовать сделать взаимодействие OpenCL/OpenGL...