2009-05-03 12 views
16

Muszę naśladować tryby mieszania programu Photoshop ("multiply", "screen" itd.) W moim kodzie OpenGL ES 1.1 (bez cieniowania).Tryb mieszania programu Photoshop na OpenGL ES bez modułów cieniujących

Istnieje kilka docs, w jaki sposób to zrobić z HLSL:

muszę przynajmniej tryb roboczy ekranu.

Czy są jakieś implementacje na ustalonym rurociągu, na które mogę spojrzeć?

+1

Strona [To] (http://www.pegtop.net/delphi/articles/blendmodes/) zawiera wiele szczegółów dotyczących działania każdego trybu mieszania (z diagramami). – bobobobo

Odpowiedz

15

Większość trybów mieszania w programie photoshop opiera się na mieszanych trybach Porter-Duff.

Wymaga to, aby wszystkie obrazy (tekstury, renderowanie) były w przedwzmacnianej przestrzeni kolorów. Zwykle robi się to poprzez pomnożenie wszystkich wartości pikseli wartością alfa przed zapisaniem ich w teksturach. Na przykład. pełny przezroczysty piksel będzie wyglądał jak czarny w niezagiętej przedwzmacnianej przestrzeni kolorów. Jeśli nie wiesz, co to za kolor, spędź godzinę lub dwie, czytając o tym w Internecie. Jest to schludny i dobry pomysł, wymagany do tworzenia kompozycji przypominających photoshop.

Zresztą - skoro masz swoje zdjęcia w tym formacie można włączyć ekran za pomocą:

glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_COLOR) 

trybie pełnego MULTIPLY nie jest możliwe z OpenGL ES | rurociągu. Jeśli tylko pracować z pełnymi nieprzezroczystych pikseli można udawać, używając:

glBlendFunc(GL_ZERO, GL_SRC_COLOR) 

Wyniki dla przezroczystych pikseli albo w swojej fakturze a bufora ramki będzie źle chociaż.

1

Najlepszym miejscem na rozpoczęcie jest odebranie kopii Red Book i przeczytanie rozdziałów dotyczących materiałów i trybów mieszania. Ma bardzo obszerne i jasne wyjaśnienie, jak działają "klasyczne" funkcje mieszania OpenGL.

10

należy spróbować tego:

glBlendFunc(GL_DST_COLOR, GL_ONE_MINUS_SRC_ALPHA) 

To wygląda pomnożenie mi na iPhone/OpenGL ES

+1

Dziękuję za wspaniałą odpowiedź, wygląda dokładnie tak mnożenie w Photoshopie (: –

+0

Działa to tylko wtedy, gdy obraz ma jednolity kolor (nieprzezroczysty) .Jeśli masz obraz z przezroczystością, po prostu musisz umieścić go przed białym tłem, a następnie spróbuj tego. – Peter

1

I odkryli, że za pomocą tego:

glDepthFun(GL_LEQUAL);

wszystko Potrzebuję efektu ekranu, przynajmniej dobrze działało w moim projekcie.

Nie jestem pewien, dlaczego to działa, ale jeśli ktoś wie, proszę podziel się.