2D izometrik oyunda gerçek zamanlı gölge dökümü


15

C ++ ile küçük bir 2d izometrik motor yazıyorum ve gerçek zamanlı gölge döküm uygulamaya çalışıyorum. Bu sayfada açıklanan basit bir yaklaşımı izledim ve işte sonuç (ışık sarı küple aynı konumda bulunuyor):

resim açıklamasını buraya girin

Sonuç çok güzel ama duvarlarda ve küplerin üstünde eksik gölgeler var. İşte nasıl görünmesi gerektiğine bir örnek (beklenen gölgeleri yeşil olarak çizdim):

resim açıklamasını buraya girin

Çizilen tüm küpler, XY konumunda ve Z derinliğinde (z = x + y) bulunan 3 2D dörtlüden oluşur. Ortografik bir matris (glOrtho) ile OpenGL kullanıyorum. Gölgeler şablon tamponu kullanılarak çizilir.

Bu gölge döküm uygulamasını tamamlamama yardımcı olacak kaynaklar veya çözümler arıyorum.

Çok teşekkürler!


5
"Bu sayfa" bağlantınız bir sayfayı değil, bir resmi gösteriyor. Ayrıca, sadece burada tahmin ediyorum, ancak bu sorunu 3D olarak çözmek ve kamerayı iosmetrik olarak yansıtmak daha kolay olabilir.
Tetrad

Oups, haklısın, bağlantıyı düzelttim. Bir 3D projeksiyon ile kesinlikle daha kolay olurdu, ancak 2D'nin de avantajları var ve eminim bunu 2D'de uygulamak için çözümler var.
XPac27

Yanıtlar:


6

Çatı ve duvarlar için duvar bölümleriniz ile oluşturulan gölgeler bölgeleri arasındaki kesişimleri belirlemeye çalışabilirsiniz. Gölgelerinizin iki geçişli işlenmesine ihtiyacınız var. Birincisi bugün ne yaptığınızı yapacak (bellek depolamada). İkinci geçiş çatı ve duvar kesişimlerini hesaplayacaktır. Son aşama gerçek render. DeadMG yanlış, bunu yapabilirsiniz.

Not: çatı için gölge alanı ve çatı alanını kesişmelisiniz.


İyi tavsiye için teşekkürler! Bu ikinci geçişi, hangi segmentlerin nokta ürünü kullanılarak gölgeler segmentlerine göre hesaplanması gerektiğini kontrol ederek optimize edebilir. Bunu deneyeceğim ve işe yarıyorsa geri göndereceğim.
XPac27

Bir süre oldu ama sonunda önerileriniz sayesinde işe başladım! Sadece 2 geometri metoduna ihtiyacım vardı (biri bir noktanın çokgen içinde olup olmadığını bilmek ve diğeri iki parçanın kesişimini elde etmek için). Hala çatıları idare etmem gerekiyor ama bunu bilmek kolay görünüyor. Bu videoda sonucu izleyebilir ve burada kaynak koduna bakabilirsiniz (sadece 1 gün üzerinde çalıştım, böylece daha fazla optimize etmek mümkün olabilir).
XPac27

@ XPac27 inanılmaz. Paylaşım için teşekkürler.
ashes999

0

Temel olarak, aradığınız şey yapılamaz. Bir grup 2D nesneyi alıp 3D nesnelermiş gibi gölgelendirmelerini istiyorsunuz. Tam 3D gölgelere sahip olmak istiyorsanız, 3D nesneleriniz olması gerekir.


1
Ancak bu, söz konusu gibi 3d gölge döküm değil. Herhangi bir duvar bu doğrultuda görüş hattını tamamen engeller, değişken yükseklikte nesneler olamaz.
yuriks

0

Açıklanan çözüm tam 3d çözüm gerektirmediğinden tam 3d değildir. Öyle görünecek ama değil. Gölge dökümü oluşturulması hacim arasındaki kesişim olarak düşünülmelidir. İhtiyacı olan şey daha az karmaşık. (Eğer kown varsa) kıyamet ve render motoru gibi kıyamet unutmayın. Tüm işlemler iki boyutta yapılmıştır.


0

Bu oyunun küçük olmasını istediğiniz göz önüne alındığında, mevcut gölge uygulamasının yeterince iyi olduğunu söylemeye ne dersiniz?

Bunu eylemde görmediğimi itiraf ediyorum, yani, bu oyunlar dinamik nesneler ve dinamik ışık kaynakları ile canlı yayınlandığında ancak görüntülerinizden yola çıkarak gölge kusurlarının ne kadar rahatsız edici veya rahatsız edici olmadığını görmedim , ' "Yeterince iyi, şimdi oyunu tamamlamaya odaklan" demeye çok cazip geldim. Mevcut uygulama küçük olur ve hızlı yürütülürse ve sorun olarak algıladığınız sorunu düzeltmek kodu büyük ve yavaş hale getirirse, bu gölgeler hakkında endişelenmekten daha iyi olduğunu düşünüyorum.

Biliyorum, biliyorum, bir problemin çözümü olarak "problemi çözmeye çalışmayın" demek kötü bir uygulama olabilir. Yine de, dürüstçe, kodunuz için küçük bir ayak izi istiyorsanız, bunun gerçekten iyi olduğunu söylemek istiyorum.

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.