Piksel aslını koruyan dönüştürülmüş 2D spritelar için “retro” piksel gölgelendirici nasıl oluşturulur?


10

Aşağıdaki resim, bir arka planın üstünde nokta örnekleme ile oluşturulan iki sprite göstermektedir:

resim açıklamasını buraya girin

  • Sol kafatasına herhangi bir döndürme / ölçekleme uygulanmaz, bu nedenle her piksel arka planla mükemmel şekilde eşleşir.
  • Sağ kafatası döndürülür / ölçeklendirilir ve bu da artık eksene hizalanmayan daha büyük piksellerle sonuçlanır .

Dönüştürülen hareketli grafiği, sahnenin geri kalanıyla aynı boyutta eksene hizalanmış piksellerle sağda oluşturacak bir piksel gölgelendiricisini nasıl geliştirebilirim?

Bu, sprite ölçeklendirmesinin Monkey Island gibi eski oyunlarda nasıl uygulandığı ile ilgili olabilir, çünkü elde etmeye çalıştığım etki bu, ancak rotasyon eklendi.


Düzenle

KaoD'un önerilerine göre, sorunu bir post-süreç olarak ele almaya çalıştım. En kolay yaklaşım, önce ayrı bir oluşturma hedefine (istenen piksel boyutuyla eşleşecek şekilde altörnek olarak) dönüştürülmek ve daha sonra ikinci kez oluşturulurken yükseltmekti. Yukarıdaki şartlarımı ele aldı.

İlk yapmayı denedim Linear -> Pointve sonuç şuydu:

resim açıklamasını buraya girin

Bozulma yok ama sonuç bulanık görünüyor ve vurgu renklerinin çoğunu kaybediyor. Benim düşünceme göre, ihtiyacım olan retro görünümü kırıyor.

İkinci kez denedim Point -> Pointve sonuç şuydu:

resim açıklamasını buraya girin

Bozulmaya rağmen hareket halindeyken durağan bir görüntü olarak daha iyi görünse de, bu benim ihtiyaçlarım için yeterince iyi olabilir.

Göstermek için, YouTube pikselleri filtrelemesine rağmen, efektin bir videosu:

http://youtu.be/hqokk58KFmI

Ancak, birisinin hareket ederken bozulma miktarını azaltırken daha net bir görünüm sağlayan daha iyi bir örnekleme çözümü bulması durumunda soruyu birkaç gün daha açık bırakacağım.


Bu bir kafatası olmalı ...?
DeadMG

@DeadMG Öküz kafatası, sanırım?
David Gouveia

Güzel etki, düşündüğümden daha iyi görünüyor (ÇOK düşük çözünürlüklü ve palette, 40x30 EGA'da denedim.) Bu, kendi postfx gölgelendiricinizi yapacağınız görünümdür. BTW, etkisini istediğiniz gibi koruyan daha iyi bir örnekleme çözümü olduğundan şüpheliyim. NN bu net görüntüyü veren şeydir, diğer herhangi bir örnekleme son görüntüyü bulanıklaştıracaktır (sadece tahmin).
kaoD

@kaoD Ama iki geçiş yaptığımı hatırla. Görüntüyü yükselten ikinci geçiş , retro hissini korumak için hala en yakın komşu olacaktır. Ancak ilk geçişte farklı örnekleme tekniklerini denemenin bazı faydaları olabileceğini düşünüyorum. Şu anda Scale2x'i arıyorum!
David Gouveia

@kaoD Nah, pes ediyorum. Her bir hareketli grafik çağrısı arasındaki gölgelendirici parametrelerini değiştirmek SpriteBatchAnında mod kullanmamı gerektirir, bu yüzden zahmete değmez. Bununla gideceğim :)
David Gouveia

Yanıtlar:


3

Gölgelendiricinizi hareketli grafiğiniz döndürüldükten SONRA uygulamalısınız.

Tüm sahne henüz gölgelenmemişse ve spritelarınız gerçekten pikselli ise, ihtiyacınız olan şey tüm sahneniz için bir tür FX sonrası filtre. Piksellerin ortalama bölgeleri düzgün çalışacaktır. Tam olarak istediğin şey değil (hareket ederken / dönerken biraz titrek görünecek) ama hile yapabilir.

Bu retro görünümü istediğiniz şey için doğru tutmanın tek yolu, sprite rotasyonlarınızı kendiniz çizmektir. Ölçeklendirmenin nasıl uygulandığıyla ilgisi yoktur: çözünürlük aslında zayıftı, bundan hangisi, son derece düşük çözünürlüklerle denediniz mi? Ayrıca hile yapabilir ve daha doğal görünecektir, çünkü aslında baktığınız etkiye neden olan şey budur. Ve ucuz! Çok ucuz! Aslında zaten sahip olduğunuzdan daha ucuz olacaktır (daha az parça gölgelendirici uygulamaları.)

Efekt örnek resminizde bozulmuştur, çünkü çözünürlüğünüz spritelarınıza kıyasla yüksektir, böylece sahnedeki gerçek pikselleri görmenizi sağlar.


Evet, henüz gölgelendirici kullanmıyorum. SpriteBatchNokta örnekleme açıkken XNA'nın varsayılanı ile oluşturulan çok düşük çözünürlüklü dokulara sahip düzenli spritelar . Ancak bir post-fx gerçekten işe yarayabilir. Yeni başlayanlar için, bir oluşturma hedefine doğrusal örnekleme ile oluşturmayı deneyeceğim ve ardından tüm oluşturma hedefini nokta örnekleme ile backbuffer'a dönüştüreceğim.
David Gouveia

@DavidGouveia, çözünürlüğünüzü düşürme fırsatını kaçırmayın. Gerçekten orijinal efekti elde etmek istiyorsanız, en iyi atışınız. Yüksek çözünürlüğe ihtiyacınız varsa (GFX'inizin bir kısmı yüksek çözünürlüklü ise veya yerel çözünürlükleri eşleştirmek istiyorsanız) yine de düşük çözünürlüklü bir ekran arabelleğine dönüştürebilir ve daha sonra yüksek çözünürlüklü çerçeve tamponunuzda tam olarak boyayabilirsiniz. Filtreli kapalı ekran dörtlü. Elbette dikdörtgen piksellerden kaçınmak için en boy oranlarını eşleştirmeniz gerektiğini unutmayın.
kaoD

Düzenlememi kontrol et :) Bu sorunun en yakın komşusu olan daha iyi bir örnekleme çözümü olup olmadığını hala merak ediyorum, ancak sorunun çoğunu çözdüğünü düşünüyorum. Sorunun bir süre daha çalışmasına izin vereceğim.
David Gouveia
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.