Jak mogę zmniejszyć aliasing efektu blasku zarysu?

42

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:

wprowadź opis zdjęcia tutaj

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:

wprowadź opis zdjęcia tutaj

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?

flashk
źródło

Odpowiedzi:

13

Może zamiast sprawdzić go w buforze głębokości o niskiej rozdzielczości, możesz użyć testu szablonu. Podczas renderowania normalnej sceny po prostu renderujesz obiekt, który powinien świecić w buforze szablonu (chyba, bez testowania głębi), a następnie mieszasz całą teksturę blasku, ale skonfiguruj test szablonu, aby przejść tylko tam, gdzie bufor szablonu jest nie ustawiono, dlatego maskowanie obiektu o wysokiej rozdzielczości.

W ten sposób uzyskasz dokładną sylwetkę oryginalnego obiektu, podczas gdy wygładzenie krawędzi doprowadzi tylko do przybliżonych rezultatów, ale może ci to wystarczy.

Chris mówi Przywróć Monikę
źródło
Dzięki, to zdecydowanie pomaga. Miałem nadzieję na jakąś technikę, która wspierałaby jakąś formę wygładzania krawędzi, ale wciąż jest to znaczna poprawa.
flashk