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.


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

4
Parece que você conhece sua mistura alfa!
bobobobo
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.