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:
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:
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?