Anahat ışıma etkimdeki diğer adını nasıl azaltabilirim?


42

Left 4 Dead oyununda parlayan anahat efektini kopyalamaya çalışıyorum. Etki, nesne tıkalı olsa bile nesnelerin dış hatlarının parlamasına neden olur. İşte etkinin ekran görüntüsü:

görüntü tanımını buraya girin

OpenGL tabanlı programımda bu etkiyi biraz kopyalayabiliyorum. Şu anda ne yapıyorum:

  • Parlayan nesneleri oluşturmak için ekran boyutunun yarısı kadar olan bir renk ve derinlik dokusu oluşturun
  • Parlaklık rengini / derinlik dokularını temizleyin. Renk siyah olarak temizlenir.
  • Her parlayan nesne için, onu parıltı dokusuna düz bir renk olarak verin
  • Kızdırma dokusu üzerinde ayrılabilir bir gauss bulanıklığı gerçekleştirin
  • Tam çözünürlük sahnesini normal olarak oluşturun
  • Kızdırma dokusunu normal sahne ile birlikte karıştırın, ancak nesneyi maskelemek için yalnızca bulanık anahattı bırakarak ışıma derinliği dokusunu kullanın.

İşte yaklaşımımın bir ekran görüntüsü:

görüntü tanımını buraya girin

Işıma dokusunu sahne ile birleştiren parça gölgelendiricisi:

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

Gördüğünüz gibi, çoğu zaman işe yarayacak gibi görünüyor, ancak ana hattaki diğer adı gerçekten kötü.

Anahatın iç kenarını yumuşatmak için önerisi olan var mı?

Her pikselin komşu derinlik değerlerini örneklemeli ve 1,0'a eşit derinlik değerlerinin sayısına göre parlamayı ölçeklemeli miyim?

Yoksa daha yumuşak sonuçlar üretecek daha iyi bir yaklaşım var mı?

Yanıtlar:


13

Belki düşük çözünürlüklü derinlik tamponuna karşı kontrol etmek yerine, şablon testini kullanabilirsiniz. Normal sahneyi oluştururken, yalnızca şablon arabelleğine parlaması gereken nesneyi (derinlik testi olmadan, sanırım) oluşturursunuz ve ardından tam ışıma dokusunu içinde karıştırır, ancak şablon testini yalnızca şablon arabelleğinin geçtiği yerde olacak şekilde yapılandırın ayarlanmamış, bu nedenle yüksek çözünürlüklü nesneyi maskelemek.

Bu şekilde orijinal nesnenin tam siluetini elde edersiniz, oysa kenarların düzgünleştirilmesi sadece yaklaşık sonuçlara yol açar, ancak bunlar sizin için yeterli olabilir.


Teşekkürler, bu kesinlikle yardımcı olur. Bir tür anti-aliasing biçimini destekleyen bir teknik umuyordum, ancak bu hala büyük bir gelişme.
flashk,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.