Используя кадровый буфер как вершина буферизуют, не перемещая данные в ЦП

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

6
задан Brynn Mahsman 3 April 2010 в 03:20
поделиться

4 ответа

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

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

3
ответ дан 16 December 2019 в 21:37
поделиться

Просто используйте функции для копирования и позвольте драйверу понять, как делать то, что вы хотите, скорее всего, пока вы копируете прямо в вершину buffer он на самом деле не будет копировать, а просто сделает ваш 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

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

3
ответ дан 16 December 2019 в 21:37
поделиться

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

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

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

1
ответ дан 16 December 2019 в 21:37
поделиться

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

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

1
ответ дан 16 December 2019 в 21:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: