Объедините несколько шейдеров фрагментов OpenGL - PullRequest
4 голосов
/ 21 марта 2011

Я хочу перенести некоторые работы по обработке изображений в OpenGL для повышения производительности с использованием OpenGL ES. У меня есть очень простой алгоритм определения порога, но я бы хотел добавить к изображению дополнительные фильтры (например, контрастность).

Моей первой мыслью было бы завершить это, используя несколько фрагментных шейдеров. Тем не менее, я хотел бы сделать это довольно быстро, так что это приведет к значительным изменениям состояния? Единственный метод, о котором я читал, - это сделать это, работая над текстурой, а затем несколько раз вызывать «use program».

Есть ли более эффективный способ сделать это? В идеале, я бы хотел выполнить контрастное растяжение и баланс гистограммы как часть шагов.

Если я не смогу объединить это в один шейдер, подойдет ли мне FBO здесь?

Я немного новичок в OpenGL (на случай, если вы не можете сказать).

Спасибо!

Simon

Ответы [ 2 ]

4 голосов
/ 21 марта 2011

Вы не можете «объединить» фрагментный шейдер, если вы не сделаете это вручную, поэтому единственный разумный выбор - сделать рендеринг «пинг-понг» с использованием FBO.У вас есть 2 FBO, рисуйте одно и читайте из другого, затем переключайте FBO и повторяйте, переключая фрагментные шейдеры между рендерингами.

1 голос
/ 15 апреля 2015

Рендеринг в пинг-понг довольно хорош для этой цели! Вот пример кода, который работает в LibGDX, где есть «пакетный» объект, который фактически рисует на экране, ввод которого мы можем захватить с помощью FrameBuffers:

FrameBuffer ping = fbo; // the framebuffer containing your rendered texture
for (ShaderProgram shader : shaders) {
    pong.clear();
    pong.begin();
    batch.begin();
    batch.setShader(shader);
    batch.draw(ping.getColorBufferTexture(), 0, 0, width, height);
    batch.end();
    pong.end();
    ping = pong;
}
batch.begin();
batch.draw(pong.getColorBufferTexture(), 0, 0, width, height);
batch.end();

Простой вызов pong (в моем случае создание нового кадрового буфера) стоит дорого, поэтому предварительное распределение может привести к некоторому ускорению. Это скорее продолжение ответа Матиаса, чем ответ сам по себе, но он не подходит для комментария.

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