Birden fazla 2D spot ışığı nasıl oluştururum?


12

Birden fazla varlık üzerinde bir spot ışığı sağlayan bir 2D "spot ışığı" efekti oluşturmak istiyorum. Yani, birkaç sprite meşaleler tutuyormuş gibi. Tek bir varlık için (bir spot ışığı), bir degrade hareketli grafiğinin üzerine bindiğim ve o noktadaki merkez noktası kovalamasının olduğu bir teknik kullanıyorum. Bu teknik tek bir spot ışığı için iyi çalışır. İşte neden bahsettiğimi gösteren bir ekran görüntüsü:

Tek Spot Işığı - Çalışır

Tek bir spot ışığıyla Spotlight Efekti

Karşılaştığım sorun, bu tekniğin birden fazla varlığı kapsamaması. Başka bir spot görüntüyü kaplarsam birkaç sorunla karşılaşırım. Simüle edilmiş bir ekran görüntüsü:

Birden Çok Spot Işığı = Sorun

İki spot ışığı ile spot ışığı efekti

En belirgin sorun görünür köşelerdir. Bu, spot ışığı görüntüsünü tüm seviyeyi kapsayacak şekilde devasa yaparak çözülebilir, ancak bu doğru hissetmez. İkinci ve daha zor olan sorun, karanlığı bu teknikle etkili bir şekilde çoğaltmam. Yani eklenen her hareketli grafik, herkesi karartma etkisine sahiptir. Açıkçası bu soruna yanlış yaklaşıyorum.

Herhangi bir fikir?


Sürekli Çabalar

Yorumlarda bazı karıştırma seçenekleri tartışıldı. İşte şimdiki düşüncem. Yukarıdaki tek spot ışığı örneğimde, şuna benzer bir görüntü dosyası kullanıyorum: (Daha kolay göstermek için saydamlığı yeşil renkle değiştirdim)

Şeffaflık Yaklaşımı

Yukarıda tartışıldığı gibi sorun, bu görüntüyü başka bir görüntüyle harmanlayan alfanın istenen efekti üretmeyeceğidir. Bunun yerine bunu üretecek:

İki şeffaflık çemberini üst üste bindirme

Bu beni bir karıştırma seçenekleri sorunu olarak etkilemez. Sorun, bana öyle geliyor ki, bu tür bir görüntünün, ayrılmaları gerektiğinde yerleşik saydamlık maskesi ve görüntüsüne (siyah bir kare) sahip olmasıdır.

Kesilmiş saydamlığı yerleşik olan siyah bir görüntü yerine, çalışma sırasında siyah kareye karşı kullanılan saydamlık maskeleri kullanmalıyım. Bunu yaparken hala geleneksel beyaz ve siyah saydamlık maskesini kullanamıyorum, yoksa aynı problemle karşılaşır. İşte bir örnek, bu sefer beyaz ve siyah beyaz ve siyahı temsil ediyor:

Şeffaflık Maskesi

Çözüm, görünüşe göre, kendisi şeffaflık kullanan bir şeffaflık maskesi uygulamak olacaktır. Bunun gibi bir şey: (yeşil = şeffaf)

Şeffaflık ile Şeffaflık Maskesi

Bu şekilde, birden çok saydamlık maskesi alfa harmanlanabilir ve SONRA siyah kareye karşı saydamlık maskesi olarak kullanılabilir. Alfa ile harmanlanmış iki şeffaflık maskesinin iki örneği:

Şeffaflık ile iki şeffaflık maskesi

Her neyse, uygulamak için çalıştığım yaklaşım bu. Bu işe yararsa sonuçları gönderirim. Bilmediğim şey (şu anda) şeffaflığı olan bir saydamlık maskesi kullanabilmem.


Bunu düşünerek, şeffaflık maskelerini hareket ettirip büyük siyah bir dokuya uygulamam gerekiyor gibi görünüyor. Ama bunun nasıl yapılacağı hakkında bir fikrim yok.
Cameron Fredman

7
Degradelerinizi nasıl oluşturduğunuzdan veya uyguladığınızdan emin değilsiniz, ancak bu doğru karıştırma kullanırsanız iyi çalışacağı bir karıştırma sorunu olabilir. Dokular hakkında daha fazla bilgiye ihtiyacımız var.
dennmat

Ben çerçeve olarak AndEngine kullanıyorum ve mevcut bir "setBlendFunction ()" olmasına rağmen, harmanlamanın çoğu sahne arkasında oluyor .
Cameron Fredman

Neyle bağlantı kurduğunuza baktığımda, muhtemelen ikinci çözümün altta listelenmesini veya işe yaramazsa üçüncü olmasını istediğinizi söyleyebilirim. AndEngine üzerinde net değilim ve dokümanlar var gibi görünmüyor, belki de cevabınızı bu iş parçacığında bulamazsanız, daha fazla yardımcı olabilirler, çünkü zaten harmanlama ile oynuyor gibi görünüyorlar sahne arkasında çok seçenek.
dennmat

Bu konu ilk etapta sorununuzu düzeltiyor gibi görünse de, bu değişikliği içeren versiyonunuz var mı?
dennmat

Yanıtlar:


3

Kavramsal olarak, birden fazla spot ışığının çözümü aşağıdakilerden oluşur:

  1. Sahnedeki her piksel için aydınlatma değerlerini tutmak üzere tamamen siyah bir dizi ile başlayın.
    • Sıfır, görüntünün herhangi bir ışığı olmayan bir alanını temsil eder.
    • % 100 tamamen gün ışığı ile doymuş bir alanı temsil edecektir.
    • Süslü olmak istiyorsanız,% 100'den yüksek bir değere sahip olabilirsiniz (örneğin,% 200), görüntünün aşırı doygun bir alanını temsil eder ve her şeyi kör edici bir beyaz piksel blobuna bulanıklaştırır. Daha sonra endişe ve şimdilik% 0-100 arasındaki değerleri sınırlamak.
  2. Ekrandaki ya da halesinin ışığa ekleyeceği kenara yeterince yakın olan her ışık kaynağı için, o ışık kaynağından ışık değerlerini sahne pikselleri için ışık değerleri dizinize ekleyin.
  3. Sahne alanınızdaki pikselleri aşağıdaki gibi değiştirmek için sonuçta elde edilen ışık değeri dizisini kullanın:
    • % 0 ışıkla yanan pikseller siyahtır.
    • % 100 ışıkla yanan pikseller normal renklerinde.
    • Diğer pikseller arasında kısmen bir renk bulunur.
    • Ekran görüntülerinize bakarak bu adımı nasıl yapacağınızı zaten biliyorsunuz.

Hile, alfa harmanlamanın bu adımlardan birini veya daha fazlasını yapabileceğini anlamaktır. Alfa harmanlama, bir görüntünün veya dokunun piksellerini basit bir şekilde değiştirmek için bir alfa harita / görüntü kullanmayı ifade eder. Aynı zamanda, hızlı hale getirmek için hızlı bir işlevler kümesi olacağı veya özel donanım komutlarıyla uygulanacağı anlamına gelir. Normal dizilerle ve normal dil komutlarıyla yapabilirsiniz, ancak özel alfa / karıştırma kitaplığı işlevlerini kullanmak muhtemelen daha iyidir. ... Ve böcek olmayacak. Bazen bu, pikselleri kısmen saydam yapmak anlamına gelir, ancak durumunuz için bu şu anlama gelir:

  • # 1'den ışık değeri dizisini oluşturmak için her piksele alfa değerleri ekleme.
  • 3. adımdaki pikseller için son renkleri çözmek üzere # 1'den gelen ışık değeri dizisini kullanma.

Çeşitli türlerdeki pikselleri birleştirmek için hangi işlevleri sağladıklarını görmek için alfa karıştırma işlevlerinizin belgelerine bakmaya başlarım. Gerçekleştirmeniz gereken adımların her biri için işlevlere sahip olacaklarından şüpheleniyorum, ancak açık olmayan isimler altında olabilirler.


Bu cevabı kazıyorum ve bir şans vereceğim. % 100'ün üzerindeki değerler için bir mercek parlaması / bulanıklık fikri de güzel ve ilham verici bir bonus. Bu süreçte öğrenilen derslerle güncellemeler yayınlayacaktır. Teşekkürler ET
Cameron Fredman
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.