So invertieren Sie die Farbe des Hintergrundpixels


10

Ich schreibe einen Spiel- und Karteneditor mit Java und jMonkeyEngine. Im Karteneditor habe ich einen Pinsel mit Drahtgitterkugel gemacht. Mein Problem ist: Ich möchte es überall sichtbar machen, also möchte ich die Farbe des Pixels "hinter" diesem Pinsel invertieren. Ich wollte es mit Fragment Shader (GLSL) machen, aber ich weiß nicht, wie ich die Farbe dieses Pixels erhalten soll.


Unterstützt jMonkeyEngine Post-Process-Effekte? Sie müssen wahrscheinlich diesen Weg gehen.
Sam Hocevar

Ja, jMonkeyEngine unterstützt Post-Process-Effekte, aber ich kenne sie derzeit nicht so gut. Danke für den Vorschlag.
m4tx

Mmmh, egal, es gibt einfachere Wege. Ich werde versuchen, richtig zu antworten.
Sam Hocevar

Können Sie glLogicOp (GL_XOR) verwenden? opengl.org/sdk/docs/man/xhtml/glLogicOp.xml
Adam

1
Beachten Sie, dass die Inversion nicht die Sichtbarkeit in einer ganzen Reihe von Eckfällen wie ungesättigten Grautönen garantiert und in vielen anderen Fällen eine schlechte Sichtbarkeit bietet.
Lars Viklund

Antworten:


15

Der schnelle und einfache Weg, dies zu tun, besteht darin, die Standard-Mischungsgleichung mit den folgenden Parametern zu verwenden:

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

Wenn srces sich um die Quellfarbe (die Farbe Ihres neuen Objekts) und dstdie Zielfarbe (die Farbe im Framebuffer) handelt, wird die neue Farbe wie folgt berechnet:

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

Sie müssen also nur einstellen src = 1, dh. weiß, und Sie erhalten inverses Video. Der GLSL-Fragment-Shader lautet:

void main(void) {
    gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
}

4
Klingt so, als ob Sie Ihre Alpha-Mischung kennen!
Bobobobo
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.