Programowanie GPGPU z OpenGL ES 2.0

Próbuję wykonać pewne przetwarzanie obrazu na GPU, np. mediana, rozmycie, jasność itp. Ogólną ideą jest zrobienie czegoś takiego jak Ten framework z GPU Gems 1.

Jestem w stanie napisać GLSL fragment shader do przetwarzania pikseli, ponieważ próbowałem różnych rzeczy w aplikacji effect designer.

Nie jestem jednak pewien, jak powinienem wykonać drugą część zadania. Oznacza to, że chciałbym pracować nad obrazem w image coords, a następnie wypisywać wynik do tekstury. Znam zmienną gl_FragCoords.

Z tego co rozumiem to wygląda tak: muszę ustawić widok (może ortograficzny?) i quad w taki sposób, że pixel shader zostanie zastosowany raz do każdego piksela w obrazie i tak, że będzie renderować do tekstury lub czegoś takiego. Ale jak Mogę to osiągnąć, biorąc pod uwagę głębię, która może sprawić, że sprawy będą dla mnie nieco niezręczne...

Byłbym bardzo wdzięczny, gdyby ktoś mógł mi w tym pomóc. zadanie, ponieważ jestem naprawdę sfrustrowany sobą.

Aktualizacja:

Wygląda na to, że będę musiał użyć FBO, dostając taki: glBindFramebuffer(...)

Author: Bill the Lizard, 2011-03-01

4 answers

Zasadniczo potrzebujesz 4 pozycji wierzchołków (jako vec2) czworokąta (z rogami (-1,-1) i (1,1)) przekazanymi jako atrybut wierzchołka.

Nie potrzebujesz projekcji, ponieważ shader nie będzie jej potrzebował.

Utwórz FBO, zwiąż go i przymocuj docelową powierzchnię. Nie zapomnij sprawdzić stanu kompletności. Połącz shader, Ustaw tekstury wejściowe i narysuj kwadrat.

Twój Shader wierzchołków może wyglądać tak:

#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
}

I fragment shader:

#version 130
in vec2 tc;
uniform sampler2D unit_in;
void main() {
    vec4 v = texture2D(unit_in,tc);
    gl_FragColor = do_something();
}
 5
Author: kvark,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-01 14:19:20

Użyj tego tutoriala, jest on skierowany do OpenGL 2.0, ale większość funkcji jest dostępna w ES 2.0, jedyne co mam wątpliwości to Tekstury zmiennoprzecinkowe.

Http://www.mathematik.uni-dortmund.de / ~goeddeke/gpgpu/tutorial.html

 7
Author: Matias Valdenegro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-01 11:55:14

Jeśli potrzebujesz przykładu, stworzyłem Ten projekt dla urządzeń z systemem iOS do przetwarzania klatek wideo pobranych z kamery za pomocą shaderów OpenGL ES 2.0. Więcej na ten temat wyjaśnię w moim writeup tutaj .

W zasadzie, pobieram dane BGRA dla ramki i tworzę z niej teksturę. Następnie używam dwóch trójkątów, aby wygenerować prostokąt i zmapować na nim teksturę. Shader jest używany do bezpośredniego wyświetlania obrazu na ekranie, wykonywania pewnych efektów na obrazie i wyświetlania go, lub wykonaj pewien efekt na obrazie, gdy w FBO poza ekranem. W ostatnim przypadku mogę użyć glReadPixels(), aby pobrać obraz w celu przetwarzania opartego na procesorze, ale najlepiej byłoby to naprawić, aby przetworzony obraz był po prostu przekazywany jako Tekstura do następnego zestawu shaderów.

 4
Author: Brad Larson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-01 15:52:38

Powinieneś również sprawdzić ogles_gpgpu , który obsługuje nawet systemy Android. Przegląd na ten temat znajduje się w tej publikacji: obliczenia równoległe do cyfrowego przetwarzania sygnału na urządzeniach mobilnych GPU.

Możesz zrobić bardziej zaawansowane rzeczy GPGPU z OpenGL ES 3.0 teraz. Sprawdź ten post na przykład. Apple ma teraz również "Metal API", który umożliwia jeszcze więcej operacji obliczeniowych GPU. Oba, OpenGL ES 3.x i Metal są obsługiwane tylko przez nowsze urządzenia z chipem A7.

 3
Author: IsaacKleiner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-11 12:53:10