Wie kann ich das Aliasing in meinem Konturglühen reduzieren?

42

Ich versuche, den leuchtenden Kontureffekt im Spiel Left 4 Dead zu replizieren. Der Effekt lässt einen Objektumriss leuchten, selbst wenn das Objekt verdeckt ist. Hier ist ein Screenshot des Effekts:

Bildbeschreibung hier eingeben

Ich bin in der Lage, diesen Effekt in meinem OpenGL-basierten Programm zu replizieren. Das mache ich gerade:

  • Erstellen Sie eine Farb- und Tiefenstruktur, die der Hälfte der Bildschirmgröße für das Rendern der leuchtenden Objekte entspricht
  • Löschen Sie die leuchtenden Farben / Tiefen-Texturen. Die Farbe wird zu Schwarz gelöscht.
  • Rendern Sie jedes leuchtende Objekt auf die leuchtende Textur als Volltonfarbe
  • Führen Sie eine trennbare Gaußsche Unschärfe auf der Glühtextur durch
  • Rendern Sie die Szene in voller Auflösung wie gewohnt
  • Mischen Sie die Glühtextur mit der normalen Szene. Verwenden Sie jedoch die Glühtiefen-Textur, um das Objekt auszublenden und nur den verschwommenen Umriss zu lassen.

Hier ist ein Screenshot meines Ansatzes:

Bildbeschreibung hier eingeben

Hier ist der Fragment-Shader, der die Leuchttextur mit der Szene kombiniert:

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

Wie Sie sehen, scheint es größtenteils zu funktionieren, aber das Aliasing in der Gliederung ist wirklich schlecht.

Hat jemand Vorschläge zum Glätten des inneren Randes der Kontur?

Soll ich die benachbarten Tiefenwerte jedes Pixels abtasten und das Leuchten basierend auf der Anzahl der Tiefenwerte skalieren, die gleich 1,0 sind?

Oder gibt es einen besseren Ansatz, der zu glatteren Ergebnissen führt?

Blitz
quelle

Antworten:

13

Vielleicht verwenden Sie den Schablonentest, anstatt ihn mit dem Tiefenpuffer mit niedriger Auflösung zu vergleichen. Wenn Sie die normale Szene rendern, rendern Sie einfach das Objekt, das in den Schablonenpuffer leuchten soll (glaube ich, ohne Tiefenprüfung) und mischen dann die gesamte Glühtextur ein. Konfigurieren Sie den Schablonenpuffer jedoch so, dass er nur dort durchläuft, wo sich der Schablonenpuffer befindet nicht gesetzt, daher das hochauflösende Objekt ausblenden.

Auf diese Weise erhalten Sie die exakte Silhouette des Originalobjekts, wohingegen ein Glätten der Kanten nur zu ungefähren Ergebnissen führen würde, aber möglicherweise würden diese für Sie ausreichen.

Chris sagt Reinstate Monica
quelle
Danke, das hilft auf jeden Fall. Ich habe auf eine Technik gehofft, die eine Form von Anti-Aliasing unterstützt, aber dies ist immer noch eine große Verbesserung.
Flashk