Opengl-es 1.1 изменяет пиксельные данные на FBO

Есть ли способ получить пиксельные данные FBO, а затем: быстро оттенить их серым и снова вернуть изображение в этот FBO?


person lacas    schedule 02.08.2012    source источник


Ответы (1)


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

Если вы используете шейдеры (ES 2.0), вы можете сделать это напрямую на графическом процессоре, что быстрее. Это означает выполнение масштабирования серого во фрагментном шейдере одним из нескольких способов:

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

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

Вот математика в оттенках серого, если вам это нужно: https://web.archive.org/web/20141230145627/http://bobpowell.net/grayscale.aspx По существу, подставьте значения RGB в эту формулу и используйте полученное значение яркости во всех ваших каналах.

person Ben Zotto    schedule 02.08.2012
comment
Спасибо, но glReadPixels не вариант, потому что он очень медленный и лагает. :( Любые другие в фиксированном конвейере? - person lacas; 02.08.2012
comment
@lacas: Без шейдеров единственный другой способ сделать это - для начала отобразить экран в оттенках серого. Вам, вероятно, нужно будет задать отдельный вопрос с более подробной информацией о вашей сцене (2D? 3D? освещение? и т. д.), чтобы получить разумные ответы о том, как подойти к этому, но теоретически вы можете модулировать все свои цвета так, чтобы вы были только окрашивание в серый цвет. - person Ben Zotto; 02.08.2012