GLSL Shader Efektleri: Hareket bulanıklığı nasıl yapılır?


16

Tam bir 2D ortamım var, spritelar manzara, karakterler vb.

Daha modern bir görünüm elde etmek için, kamerayı hızlı bir şekilde hareket ettirirken modern FPS oyunları (yani Crysis) bulanıklığına benzer bir hareket bulanıklığı efekti uygulamak istiyorum.

Bir yan kaydırıcıda, istenen etki, kamera hareket ederken hızlı hareket fikri vermek için bu hafif bulanıklığa sahip olmaktır. Birisi bana bunu yapmak için bazı ipuçları verebilirse, bir piksel gölgelendiricisinde varsayıyorum, minnettar olurum.


Oluşturulan arabelleğinizin birden çok kopyasını saklayın. Örneğin, geçerli karenizi oluşturmak için önceki karelerden dördünü bulanıklaştırın. Bu istediğiniz efekti yaratmalıdır.
knight666

@ knight666, 1 ekstra tampon tutmak (A olarak adlandırın) ve bunun bir bölümünü (0.75 diyelim) çıktı tamponuyla (ekrana gidecek şekilde karıştırmak) daha iyi olmaz (kesinlikle bellek, emin değilim) B olarak adlandırın) ve daha sonra B'yi A'ya kopyalayın. Bu, hareketli bir ortalama yaratacak ve artan hareket bulanıklığı ekstra bir maliyete neden olmayacaktır.
Elva

1
Bunu bir yorum yapmak istedim, ancak yorum düğmesini bulamadım. Her neyse, Dave O.'in söylediği muhtemelen en iyi bahistir ve Crysis gibi oyunlarda kullanılan şeydir. Bu biraz böyle çalışıyor. Nesne oluşturma sırasında, nesne hızlarını ayrı bir arabellekte işleyin. MRT bunu biraz daha hızlı hale getirecek ve hızları hesaplamak için birden fazla yol var, ancak tüm oluşturma arabelleği için hızlara sahip ek bir tamponla sonuçlanmak istiyorsunuz. Daha sonra her pikseldeki hıza bağlı olarak bir işlem sonrası gölgelendiricisinde, hızın ters yönünde renk arabelleğine örnek veriyorsunuz
Arelius

Liste 27-1'deki HLSL / Cg kodu, derinlik arabelleği ve akımın tersini kullanarak belirli bir pikselde oluşturulan nesnelerin dünya boşluk konumunu hesaplamak için tam ekran işlem sonrası piksel gölgelendiricisindeki önceki denklemleri kullanır görünüm projeksiyon matrisi. ... HLSL .... Kodunuzda GLSL değil .....

Yanıtlar:


6

Son çerçeve arabelleğinin bir kopyasını saklayın. Kamera hareket vektörünü alın ve ters çevirin. Sahnenizi her zamanki gibi çizin, ardından son kare arabelleğini hafif bir ofset (az önce hesapladığınız kamera deltası) ve 0,75 alfa ile çizin. Hareket bulanıklığı efekti vermek için istediğiniz kadar tekrarlayın.


1
Bu yaklaşımın uygulanması çok kolaydır, ancak ince ayarlaması çok zordur (bulanık olmak yerine iz bırakan nesneler gibi görünebilir). Bir başka basit yaklaşım da işleme sonrası piksel gölgelendiricisinde ters kamera hareket yönünde pikselleri "lekelemektir".
Dave O.

6
Bu yaklaşımla ilgili temel sorun, çerçeveye bağımlı olmasıdır - 20 fps'de çalıştırıyorsanız, 100 fps'de çalıştırıyorsanız nasıl göründüğünden çok farklı görünecektir. Bunun farkında olduğunuz ve koştuğunuz kare hızında istediğiniz sonucu elde ettiğiniz sürece iyi, ancak bunun farkında olmanız gerekir.
Maximus Minimus

19

Bu yöntemi kullanmanızı öneririm: İşleme Sonrası Efekt olarak Motion Blur

Uygulaması çok basit, benim glsl demo Ruin adasında kullandığım [bağlantı]


Bu yöntem, geçmiş karelerde harmanlamadan çok daha üstündür ...
Steven Lu

Şimdi olduğu gibi, bu cevap sadece bir bağlantı sağlar. Bağlantı gelecekte koparsa, kimse problemlerini nasıl çözeceğini bilemez . En azından bağlantının size verdiği temel bilgileri eklemeyi deneyin

Evet, internetin bir kopyasını yapalım, çünkü bu kopya hiçbir zaman kırılmayacak: J
SasQ
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.