Программирование GPGPU с помощью OpenGL ES 2.0 - PullRequest
9 голосов
/ 01 марта 2011

Я пытаюсь выполнить некоторую обработку изображения на графическом процессоре, например, медиана, размытие, яркость и т. д. Общая идея состоит в том, чтобы сделать что-то вроде этого каркаса из GPU Gems 1.

Я могу написать фрагментный шейдер GLSL для обработки пикселей, поскольку я пробовал разные вещи в приложении дизайнера эффектов.

Я не уверен, однако, как я должен выполнить другую часть задачи. То есть я хотел бы работать с изображением в координатах изображения и затем выводить результат в текстуру. Мне известна переменная gl_FragCoords.

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

Я был бы очень признателен, если бы кто-нибудь мог помочь мне с этой довольно простой задачей, поскольку я действительно разочарован собой.

UPDATE:

Кажется, мне придется использовать FBO, получая вот так: glBindFramebuffer(...)

Ответы [ 4 ]

7 голосов
/ 01 марта 2011

Используйте это руководство, оно нацелено на OpenGL 2.0, но большинство функций доступно в ES 2.0, единственное, в чем я сомневаюсь, это текстуры с плавающей запятой.

http://www.mathematik.uni -dortmund.de /~ goeddeke / GPGPU / tutorial.html

5 голосов
/ 01 марта 2011

В основном вам нужно 4 позиции вершин (как vec2) четырехугольника (с углами (-1, -1) и (1,1)), переданными как атрибут вершины.

На самом деле проекция не нужна, потому что шейдеру она не нужна.

Создайте FBO, привяжите его и прикрепите целевую поверхность. Не забудьте проверить статус полноты. Свяжите шейдер, настройте входные текстуры и нарисуйте квад.

Ваш вершинный шейдер может выглядеть так:

#version 130
in vec2 at_pos;
out vec2 tc;
void main() {
    tc = (at_pos+vec2(1.0))*0.5;        //texture coordinates
    gl_Position = vec4(at_pos,0.0,1.0); //no projection needed
}

И фрагментный шейдер:

#version 130
in vec2 tc;
uniform sampler2D unit_in;
void main() {
    vec4 v = texture2D(unit_in,tc);
    gl_FragColor = do_something();
}
4 голосов
/ 01 марта 2011

Если вы хотите пример, я создал этот проект для устройств iOS для обработки кадров видео, снятых с камеры, с помощью шейдеров OpenGL ES 2.0. Я объясню больше об этом в моей статье здесь .

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

3 голосов
/ 11 января 2015

Вы также должны проверить ogles_gpgpu , которая даже поддерживает системы Android.Обзор этой темы приводится в этой публикации: Параллельные вычисления для цифровой обработки сигналов на графических процессорах мобильных устройств .

Теперь вы можете выполнять более сложные задачи GPGPU с помощью OpenGL ES 3.0.Проверьте этот пост например.У Apple теперь также есть «Metal API», который позволяет еще больше вычислений на GPU.И OpenGL ES 3.x, и Metal поддерживаются только новыми устройствами с чипом A7.

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