Есть ли способ получить пиксельные данные FBO, а затем: быстро оттенить их серым и снова вернуть изображение в этот FBO?
Opengl-es 1.1 изменяет пиксельные данные на FBO
Ответы (1)
Если вы используете конвейер с фиксированной функцией (ES 1.1), вы можете использовать glReadPixels
для извлечения данных пикселей из графического процессора, чтобы вы могли обрабатывать их напрямую. Затем вам нужно создать текстуру из этого результата и визуализировать четырехугольник, сопоставленный с новой текстурой. Но это довольно неэффективный способ достижения результата.
Если вы используете шейдеры (ES 2.0), вы можете сделать это напрямую на графическом процессоре, что быстрее. Это означает выполнение масштабирования серого во фрагментном шейдере одним из нескольких способов:
Если ваш рендеринг прост для начала, вы можете добавить математику оттенков серого в свой обычный фрагментный шейдер и, возможно, переключить его с помощью логической юниформ-переменной.
Если вы не хотите возиться с оттенками серого в своем обычном конвейере, вы можете выполнить обычный рендеринг во внеэкранный FBO (текстуру), а затем визуализировать содержимое этой текстуры в экранный FBO, используя специальный шейдер текстурирования в градациях серого, который выполняет математические операции. выборочные тексели.
Вот математика в оттенках серого, если вам это нужно: https://web.archive.org/web/20141230145627/http://bobpowell.net/grayscale.aspx По существу, подставьте значения RGB в эту формулу и используйте полученное значение яркости во всех ваших каналах.