Estou tentando replicar o efeito de contorno brilhante no jogo Left 4 Dead. O efeito faz com que o contorno de um objeto brilhe, mesmo quando o objeto está ocluído. Aqui está uma captura de tela do efeito:
Sou capaz de replicar esse efeito no meu programa baseado em OpenGL. Isto é o que estou fazendo atualmente:
- Crie uma textura de cor e profundidade com metade do tamanho da tela para renderizar os objetos brilhantes
- Limpe as texturas de cor / profundidade do brilho. A cor é limpa para preto.
- Para cada objeto brilhante, renderize-o na textura brilho como uma cor sólida
- Realize um desfoque gaussiano separável na textura de brilho
- Renderize a cena de resolução máxima normalmente
- Misture aditivamente a textura de brilho com a cena normal, mas use a textura de profundidade de brilho para mascarar o objeto, deixando apenas o contorno desfocado.
Aqui está uma captura de tela da minha abordagem:
Aqui está o shader de fragmento que combina a textura do brilho com a cena:
uniform sampler2D glowColorTex;
uniform sampler2D glowDepthTex;
uniform sampler2D sceneColorTex;
void main()
{
vec2 uv = gl_TexCoord[0].st;
vec4 color = texture2D( sceneColorTex, uv);
float depth = texture2D( glowDepthTex, uv).r;
if(depth == 1.0) {
color += 2.0 * texture2D( glowColorTex, uv);
}
gl_FragColor = color;
}
Como você pode ver, parece funcionar a maior parte do tempo, mas o alias no esboço é muito ruim.
Alguém tem alguma sugestão para suavizar a borda interna do contorno?
Devo amostrar os valores de profundidade vizinhos de cada pixel e escalar o brilho com base no número de valores de profundidade iguais a 1,0?
Ou existe uma abordagem melhor que produza resultados mais suaves?