Próbuję odtworzyć efekt świecącego konturu w grze Left 4 Dead. Efekt powoduje świecenie konturu obiektów, nawet gdy obiekt jest zasłonięty. Oto zrzut ekranu efektu:
Jestem w stanie odtworzyć ten efekt w moim programie opartym na OpenGL. Oto co obecnie robię:
- Utwórz teksturę koloru i głębi, która jest o połowę mniejsza niż ekran, w celu renderowania świecących obiektów
- Wyczyść tekstury koloru / głębi połysku. Kolor jest rozjaśniany na czarny.
- Dla każdego świecącego obiektu renderuj teksturę blasku jako jednolity kolor
- Wykonaj oddzielne rozmycie gaussowskie na fakturze połysku
- Renderuj scenę w pełnej rozdzielczości w normalny sposób
- Dodawaj mieszanie tekstury blasku ze zwykłą sceną, ale użyj tekstury głębi blasku, aby zamaskować obiekt, pozostawiając jedynie rozmazany kontur.
Oto zrzut ekranu mojego podejścia:
Oto moduł cieniujący fragmenty, który łączy teksturę blasku ze sceną:
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;
}
Jak widać, wydaje się, że w większości działa, ale aliasing na konturze jest naprawdę zły.
Czy ktoś ma jakieś sugestie dotyczące wygładzenia wewnętrznej krawędzi konturu?
Czy powinienem próbkować sąsiednie wartości głębokości każdego piksela i skalować blask na podstawie liczby wartości głębi równych 1,0?
Czy może istnieje lepsze podejście, które zapewni płynniejsze wyniki?