Использование кадрового буфера в качестве буфера вершин без перемещения данных в ЦП - PullRequest
6 голосов
/ 03 апреля 2010

В OpenGL, есть ли способ использовать данные кадрового буфера в качестве данных вершин, не перемещая данные через ЦП? В идеале объект framebuffer может быть преобразован как объект буфера вершин непосредственно в GPU. Я хотел бы использовать фрагментный шейдер, чтобы сгенерировать сетку, а затем визуализировать эту сетку.

Ответы [ 4 ]

3 голосов
/ 03 апреля 2010

Есть несколько способов сделать это, первый из них уже упоминался spudd86 (за исключением того, что вам нужно использовать GL_PIXEL_PACK_BUFFER, это тот, который записан glReadPixels).

Другой способ - использовать объект кадрового буфера, а затем прочитать его текстуру в вашем вершинном шейдере, сопоставляя идентификатор вершины (которым вы должны управлять) с местоположением текстуры. Если это однократная операция, я бы скопировал ее в PBO, затем связал в GL_ARRAY_BUFFER, а затем просто использовал в качестве VBO.

3 голосов
/ 03 апреля 2010

Просто используйте функции, чтобы сделать копирование, и позвольте драйверу выяснить, как делать то, что вы хотите, скорее всего, пока вы копируете напрямую в буфер вершин, он на самом деле не будет делать копию, а просто сделает ваш VBO ссылка на данные.

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

Изменить: возможно что-то вроде следующего может или не может работать ... (IIRC спецификация говорит, что это должно)

int vbo;
glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, vbo);
// use appropriate pixel formats and size
glReadPixels(0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, 0);
glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, 0);

glEnableClientState(GL_VERTEX_ARRAY);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, vbo);
// draw stuff

Отредактировано для исправления привязок буфера благодаря Phineas

1 голос
/ 27 мая 2010

Если вы можете выполнять свою работу в вершинном / геометрическом шейдере, вы можете использовать обратную связь преобразования для записи непосредственно в буферный объект.Также имеется возможность пропустить растеризацию и затенение фрагментов.

Обратная связь преобразования доступна как EXT_transform_feedback или базовая версия начиная с GL 3.0 (и эквивалент ARB).

1 голос
/ 04 апреля 2010

Спецификация для GL_pixel_buffer_object дает пример, демонстрирующий, как выполнить рендеринг в массив вершин в разделе «Примеры использования».

Следующие расширения полезны для решения этой проблемы:

GL_texture_float - внутренние форматы с плавающей запятой, используемые для прикрепления цветового буфера GL_color_buffer_float - отключить автоматическое ограничение для цветов фрагментов и glReadPixels GL_pixel_buffer_object - операции по передаче данных пикселей в буферные объекты

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...