¿Cómo puedo reducir el alias en mi efecto de brillo de contorno?


42

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:

ingrese la descripción de la imagen aquí

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:

ingrese la descripción de la imagen aquí

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?

Respuestas:


13

Tal vez, en lugar de compararlo con el búfer de profundidad de baja resolución, podría usar la prueba de plantilla. Al renderizar la escena normal, simplemente renderiza el objeto que debería brillar en el búfer de la plantilla (sin probar la profundidad, creo) y luego mezclar la textura de brillo completa, pero configura la prueba de la plantilla para que solo pase donde está el búfer de la plantilla no establecido, por lo tanto, enmascarando el objeto de alta resolución.

De esta forma, obtienes la silueta exacta del objeto original, mientras que un suavizado de los bordes solo daría resultados aproximados, pero tal vez estos sean suficientes para ti.


Gracias, eso definitivamente ayuda. Esperaba alguna técnica que apoyara alguna forma de suavizado, pero esto sigue siendo una mejora importante.
flashk
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.