Estoy tratando de replicar el efecto de contorno brillante en el juego Left 4 Dead. El efecto hace que el contorno de un objeto brille, incluso cuando el objeto está ocluido. Aquí hay una captura de pantalla del efecto:
Soy capaz de replicar este efecto en mi programa basado en OpenGL. Esto es lo que estoy haciendo actualmente:
- Cree una textura de color y profundidad que sea la mitad del tamaño de la pantalla para renderizar los objetos brillantes
- Limpia las texturas de color / profundidad de brillo. El color se borra a negro.
- Para cada objeto brillante, renderícelo a la textura brillante como un color sólido.
- Realice un desenfoque gaussiano separable en la textura brillante
- Renderice la escena de resolución completa como normal
- Mezcle aditivamente la textura de brillo con la escena normal, pero use la textura de profundidad de brillo para enmascarar el objeto, dejando solo el contorno borroso.
Aquí hay una captura de pantalla de mi enfoque:
Aquí está el sombreador de fragmentos que combina la textura brillante con la escena:
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 puede ver, parece funcionar en su mayor parte, pero el alias en el esquema es realmente malo.
¿Alguien tiene alguna sugerencia para suavizar el borde interior del contorno?
¿Debería estar muestreando los valores de profundidad vecinos de cada píxel y escalar el brillo en función del número de valores de profundidad que equivalen a 1.0?
¿O hay un mejor enfoque que produzca resultados más suaves?