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.

m4tx
quelle
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);
}
Sam Hocevar
quelle
4
Klingt so, als ob Sie Ihre Alpha-Mischung kennen!
Bobobobo