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.


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);
}

4
On dirait que vous connaissez votre mélange alpha!
bobobobo
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.