Jak odwrócić kolor piksela tła

10

Piszę edytor gier i map za pomocą Java i jMonkeyEngine. W edytorze map mam pędzel zrobiony przez sferę szkieletową. Mój problem brzmi: chcę, aby był widoczny wszędzie, więc chcę odwrócić kolor piksela „za” tym pędzlem. Chciałem to zrobić za pomocą modułu cieniującego fragmenty (GLSL), ale nie wiem, jak uzyskać kolor tego piksela.

m4tx
źródło
Czy jMonkeyEngine obsługuje efekty postprocesowe? Prawdopodobnie będziesz musiał iść tą drogą.
sam hocevar
Tak, jMonkeyEngine obsługuje efekty postprocesowe, ale w tej chwili nie znam ich zbyt dobrze. Dziękuję za sugestie.
m4tx
Mmmh, nieważne, są prostsze sposoby. Spróbuję odpowiedzieć poprawnie.
sam hocevar
Czy możesz używać glLogicOp (GL_XOR)? opengl.org/sdk/docs/man/xhtml/glLogicOp.xml
Adam
1
Pamiętaj, że inwersja nie gwarantuje widoczności w całej masie narożnych skrzynek, takich jak nienasycone szarości, i zapewnia słabą widoczność w wielu innych przypadkach.
Lars Viklund,

Odpowiedzi:

16

Szybkim i łatwym sposobem na to jest użycie standardowego równania mieszania z następującymi parametrami:

glEnable(GL_BLEND);
glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ZERO);

Jeśli srcjest kolorem źródłowym (tym z twojego nowego obiektu) i dstkolorem docelowym (tym, który znajduje się w buforze ramki), obliczy nowy kolor w następujący sposób:

new = src * (1 - dst) + dst * 0
    = src * (1 - dst)

Musisz tylko ustawić src = 1, tzn. biały, a otrzymasz odwrotne wideo. Moduł cieniujący fragmenty GLSL będzie:

void main(void) {
    gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
}
sam hocevar
źródło
4
Wygląda na to, że znasz mieszanie alfa!
bobobobo