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.


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

44
¡Parece que conoces tu mezcla alfa!
bobobobo
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.