Bir parıltı efekti nasıl oluşturabilirim?


9

Gerçek zamanlı gölgelendiricim için ışıltılı bir efekt yaratmaya çalışıyorum ama nasıl yapacağımı bilmiyorum.

İşte bir örnek ve başka bir örnek .

resim açıklamasını buraya girin

Bunu uygulamak için hangi tekniği kullanabilirim?


Çiçeklenmeye benzer, ancak aşağı örnek fazına bir desen (yıldız dokusu) uygulayarak işlem sonrası bir etki yoluyla elde edilebilir. Bu sadece spekülasyon zor.
akaltar

1
Normal ve aynasal bir harita bunu bir doku ile yapmanıza izin vermez mi?
JohnB

Normal haritayı kullanarak biraz test yaptım. Ancak zor olan şey, görüntü yönüne ve ışık yönüne göre onları parlatmaktır.
MaT

Yanıtlar:


10

Herhangi bir gölgelendirici tasarlaması istendiğinde, işleri daha küçük sorunlara bölerek başlamalıyız. Ve ışıltılı etkinin aslında gölgelendiricinin iyi görünmesini sağlamaz, ancak bunlardan sadece birini kullanarak genel aydınlatma ve efekt iyi görünmez.

Her şeyden önce gölgelendiricinin doğrudan bir parçası olmayan şeyi belirtelim:

  1. Gölgeleme gölgelendiricinin bir parçası değildir ve ayrı gölgeleme geçişi ile yapılır.
  2. Ben varsayalım (Söz gösterilen bu görüntü özellikle gerçek zamanlı oluşturucusunu kullanmıyor ama bu bir varsayım özellikle o) ortam tıkanıklığı yoktur.

İkincisi, gerçek gölgelendiriciyi ayrı efektlere ayıralım:

  1. Anizotropik bir aydınlatma var, bu gölgelendiricinin genel görünümüne çok benziyor. Bunun arkasındaki neden, gerçek malzemenin kumaş içermesidir, bu parlak kumaşlar ışık yansımasının yönlü bir eğilime sahip olmasını sağlar ve bu belirli yönde en fazla yansıyan ışığı yapar.

resim açıklamasını buraya girin

resim açıklamasını buraya girin Bu tür kumaşların sonsuz sayıda normali olduğuna dikkat edin, ancak burada tarif edilen teknik en önemli normal

En önemli normali yaklaşık olarak hesaplamak için, yapmanın bir yolu, doku koordinatlarını kullanmak ve ağın teğetlerini hesaplamak ve N'yi hesaplamaktır . L 1- (NT) hesaplarsınız.

Tam açıklama burada . Ve muhtemelen bahsettikleri tepe tekniğinden ziyade parça gölgelendiricisinde uygulamanız gerekir. Diğer anizotropik modeller de uygulanabilir.

Şimdi ışıltılı etki için:

Bu, dünya uzayında / yerel doku uzayında veya ekran uzayında ayrı bir geçiş olarak yapılabilir.

Düşünebildiğim algoritma, görüntü işleme tekniğini kullanıyor (örgünün doku koordinatlarına sahip olduğu varsayılarak).

  • Doku koordinatlarını kullanarak örgü yüzeyinde yüksek frekanslı bir 2D gürültü üretin, perlin gürültüsü iyi bir aday gibi görünüyor.
  • Gürültüye 3x3 çekirdek kullanarak bir maksimum filtre uygulayın. Bu, aşağıdaki görüntüye benzer bir etki yaratacaktır ve maksimum filtre burada açıklanmaktadır .

resim açıklamasını buraya girin

Yukarıdaki görüntünün sadece maks filtresine bir örnek olduğunu ve gürültüye uygulandığında yıldız alanına benzer bir şey vereceğini unutmayın.

  • Bunu yaptıktan sonra, yıldız gibi şekil elde etmek için gürültüde belirli bir sapmaya sahip bir Gauss filtresi uygulayın.

resim açıklamasını buraya girin

Maksimum (ed) gürültüye uygulanan Gausian filtresi örneği.

  • Son adım, bunu orijinal örgü dokusu ve ışık ile birleştirmektir. Bu en iyi orijinal örgü dokusu / rengi ile (|) veya ing ikili işlem kullanılarak yapılır, bu sadece beyazı gürültüden alır ve siyah pikselleri kaldırır. Işığa (ve muhtemelen diğer spekülatif haritalara) gelince, yapılacak en iyi şey onu eklemek veya daha önce birleştirdiğiniz piksellerle modüle etmektir. Daha iyi bir parlaklık için bir parlaklık sonrası işleme etkisine de ihtiyacınız olabilir.

Bu tekniğin gerçek zamanlı gölgelendirici için önemli ölçüde optimizasyon gerektirebileceğini unutmayın.


3

İlginç bir makale var AMD - Prosedür almak .

Sparkles düşündüğümden daha zor görünüyor.
İyi çözüm: 3D gürültü fonksiyonunu indekslemek için 3D pozisyonunu kullanın, görünüm vektörünü ekleyin, şeyleri daha da rastgele hale getirmek için frac fonksiyonunu kullanın.

Sparkle:
float specBase = saturate(dot(reflect(-normalize(viewVec), normal),
lightDir));
// Perturb a grid pattern with some noise and with the view-vector
// to let the glittering change with view.
float3 fp = frac(0.7 * pos + 9 * Noise3D( pos * 0.04).r + 0.1 * viewVec);
fp *= (1 - fp);
float glitter = saturate(1 - 7 * (fp.x + fp.y + fp.z));
float sparkle = glitter * pow(specBase, 1.5);
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.