Como inverter a cor do pixel de fundo

10

Estou escrevendo um editor de jogos e mapas usando Java e jMonkeyEngine. No editor de mapas, eu tenho um pincel feito por uma esfera com estrutura de arame. Meu problema é: quero torná-lo visível em todos os lugares, portanto, quero inverter a cor do pixel "por trás" deste pincel. Eu queria fazer isso com o GLSL (fragment shader), mas não sei como obter a cor desse pixel.

m4tx
fonte
O jMonkeyEngine suporta efeitos pós-processo? Você provavelmente terá que seguir esse caminho.
Sam Hocevar
Sim, o jMonkeyEngine suporta efeitos pós-processo, mas não estou muito familiarizado com eles no momento. Obrigado pela sugestão.
M4tx 5/05
Mmmh, deixa pra lá, existem maneiras mais simples. Vou tentar responder corretamente.
sam hocevar
Você pode usar glLogicOp (GL_XOR)? opengl.org/sdk/docs/man/xhtml/glLogicOp.xml
Adam
11
Observe que a inversão não garante visibilidade em vários casos de canto, como cinzas insaturados, e fornece pouca visibilidade para muitos outros casos.
Lars Viklund

Respostas:

15

A maneira rápida e fácil de fazer isso é usar a equação de mesclagem padrão com os seguintes parâmetros:

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

Se srcfor a cor de origem (a do seu novo objeto) e dsta cor de destino (a que estiver no buffer de moldura), ela calculará a nova cor da seguinte maneira:

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

Então você só precisa definir src = 1, ou seja. branco, e você obterá vídeo inverso. O shader de fragmento GLSL será:

void main(void) {
    gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
}
sam hocevar
fonte
4
Parece que você conhece sua mistura alfa!
bobobobo