Comment inverser la couleur du pixel d'arrière-plan

10

J'écris un éditeur de jeux et de cartes en utilisant Java et jMonkeyEngine. Dans l'éditeur de carte, j'ai une brosse faite par sphère filaire. Mon problème est: je veux le rendre visible partout, donc je veux inverser la couleur du pixel "derrière" ce pinceau. Je voulais le faire avec fragment shader (GLSL), mais je ne sais pas comment obtenir la couleur de ce pixel.

m4tx
la source
JMonkeyEngine prend-il en charge les effets post-processus? Vous devrez probablement suivre cette voie.
sam hocevar
Oui, jMonkeyEngine prend en charge les effets post-processus, mais je ne les connais pas trop en ce moment. Merci pour la suggestion.
m4tx
Mmmh, peu importe, il existe des moyens plus simples. Je vais essayer de répondre correctement.
sam hocevar
Pouvez-vous utiliser glLogicOp (GL_XOR)? opengl.org/sdk/docs/man/xhtml/glLogicOp.xml
Adam
1
Notez que l'inversion ne vous garantit pas la visibilité dans tout un tas de cas d'angle, comme les gris non saturés, et fournit une mauvaise visibilité pour de nombreux autres cas.
Lars Viklund

Réponses:

15

Pour ce faire, la méthode simple et rapide consiste à utiliser l'équation de fusion standard avec les paramètres suivants:

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

S'il srcs'agit de la couleur source (celle de votre nouvel objet) et de dstla couleur de destination (celle qui est dans le framebuffer), elle calculera la nouvelle couleur comme suit:

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

Il vous suffit donc de définir src = 1, à savoir. blanc, et vous obtiendrez une vidéo inverse. Le shader de fragments GLSL sera:

void main(void) {
    gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
}
sam hocevar
la source
4
On dirait que vous connaissez votre mélange alpha!
bobobobo