Cómo invertir el color del píxel de fondo

10

Estoy escribiendo un juego y un editor de mapas usando Java y jMonkeyEngine. En el editor de mapas, tengo un pincel hecho con una esfera de estructura metálica. Mi problema es: quiero que sea visible en todas partes, así que quiero invertir el color del píxel "detrás" de este pincel. Quería hacerlo con fragment shader (GLSL), pero no sé cómo obtener el color de este píxel.

m4tx
fuente
¿JMonkeyEngine admite efectos de postproceso? Probablemente tengas que ir por este camino.
Sam Hocevar
Sí, jMonkeyEngine admite efectos posteriores al proceso, pero no estoy muy familiarizado con ellos en este momento. Gracias por la sugerencia
m4tx
Mmmh, no importa, hay formas más simples. Trataré de responder adecuadamente.
sam hocevar 05 de
¿Se puede usar glLogicOp (GL_XOR)? opengl.org/sdk/docs/man/xhtml/glLogicOp.xml
Adam
1
Tenga en cuenta que la inversión no le garantiza visibilidad en un montón de casos de esquina, como los grises insaturados, y proporciona poca visibilidad para muchos otros casos.
Lars Viklund

Respuestas:

15

La manera rápida y fácil de hacer esto es usar la ecuación de mezcla estándar con los siguientes parámetros:

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

Si srces el color de origen (el de su nuevo objeto) y dstes el color de destino (el que está en el framebuffer) calculará el nuevo color de la siguiente manera:

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

Entonces solo necesitas configurar src = 1, es decir. blanco, y obtendrás video inverso. El sombreador de fragmentos GLSL será:

void main(void) {
    gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
}
sam hocevar
fuente
44
¡Parece que conoces tu mezcla alfa!
bobobobo