Лучший способ получить доступ к пикселю в OpenGL? - PullRequest
7 голосов
/ 19 января 2009

Я в значительной степени новичок в opengl. Я полагаю, что glReadPixels - это ужасно, так какой лучший способ сделать это? Я думал о наличии функции, которая блокирует прямоугольник текстуры, делает что-то вроде glTexSubImage2D, чтобы скопировать пиксели в RAM, изменить его, а затем использовать glTexSubImage2D, чтобы скопировать оперативную память обратно в текстуру. Это хороший способ? Я могу подумать об оптимизации, например, о том, что флаг запрещает копировать текстуру, так как вы будете перезаписывать все это и кэшировать.

Какие еще методы я могу использовать? Кто-нибудь из вас может сказать мне названия функций gl, которые мне могут понадобиться (чтобы я мог прочитать руководство), или указать мне учебник? Я попробовал поискать в Google, но большинство результатов выглядело не так, как я думал.

Ответы [ 3 ]

6 голосов
/ 08 ноября 2010

Как указывалось ранее, glReadPixels - это путь. Одним из способов ускорения чтения кадрового буфера или доступа к пикселям является использование расширения ARB_pixel_buffer_object. Это позволит вам делать glReadPixels асинхронно, и производительность может быть намного выше, когда вам нужно читать большое количество пикселей. Производительность может быть намного выше, потому что если вы используете «правильный» формат, передача выполняется с использованием DMA и не потребляет драгоценные циклы ЦП.

6 голосов
/ 19 января 2009

glReadPixels - это путь.

Да, это медленно - ужасно медленно. Но так оно и есть. Аналоги DirectX (например, блокировка и чтение пикселей) также не намного быстрее.

Как правило, вы хотите избежать чтения пикселей назад и что-то делать с процессором на данных. Вы можете выполнить небольшую обработку, используя пиксельные шейдеры, но это не поможет вам, если вы хотите делать скриншоты (где данные должны находиться в ЦП).

0 голосов
/ 27 января 2009

Лучшей идеей было бы рассматривать память кадрового буфера на видеокарте только для записи. Я думаю, причина в том, что видеопамять оптимизирована для записи со стороны процессора, за счет чтения. (Очевидно, что видеопамять можно быстро считывать со стороны видеокарты - она ​​должна отправлять ее на монитор в режиме реального времени)

Самое быстрое решение будет зависеть от того, что вы пытаетесь сделать (хотите уточнить?).

Ничто не мешает вам хранить свой собственный буфер кадров в основной памяти, затем копировать его в текстуру каждого кадра и отображать его в OpenGL. Я делал это раньше, и это намного быстрее, чем glReadPixels, однако вы теряете возможность считывать результаты других операций рендеринга OpenGL. Используйте это, если все, что вам нужно сделать, это поддерживать покадровое состояние части вашей сцены. Например: создание динамической текстуры, которую нельзя сделать с помощью пиксельного шейдера.

Вы также можете избежать чтения намного меньшего набора данных. Я сделал это, когда играл с нереалистичным рендерингом. Я взял свою сцену, визуализировал ее с разрешением 160x120, прочитал ее обратно в основную память, а затем перерисовал как набор 2D спрайтов.

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