Ortada renk değiştiren ışığa nasıl ulaşılır?


11

Işık kaynakları ve bazı renkli pencereler yaratmayı düşündüm. Şimdi, pencereler yarı şeffaftır. Işık (diyelim ki, saf beyaz) cama çarptığında ve camın içinden devam ettiğinde, ancak rengi geçtiği camla aynı renge dönüştürdüğünde nasıl yapabilirim?

Burada açıklanan efekt pencerenin "renkli" tarafında alan ışıkları kullanarak sahte olabilir biliyorum, ama ne sadece bir beyaz nokta ışık isteseydim?


Işığın rengini değiştirmek yerine, camın diğer tarafındaki aydınlatılmış nesnelerin taban rengini değiştirebilir misiniz? belki bu hile yapar?
HumanCatfood

Saydam pencere ikinci bir geçiş olarak işlenir, gölgelendiricisi her piksel çıkışının renk dengesini basitçe değiştirir. Bu işe yaramaz mı?
Patrick Hughes

Bana öyle geliyor ki, bu gölgeler sorununa benzer; yarı saydam nesneler tarafından gölgeler için güzel bir algoritmanız varsa (bunun pratik olup olmadığını bilmiyorum), o zaman sadece üç paralel renk kanalı için çalıştırmanız gerekir.
Kevin Reid

Yanıtlar:


14

Bunu yapmanın çok sayıda yolu vardır. Bunlar bir gölgelendiricinin kullanılmasını gerektirecek ve ben zaten piksel başına aydınlatma yaptığınızı varsayıyorum. Aşağıdakiler bazı önerilerdir, ancak sizin için doğru tekniği bulmak çok daha fazla araştırma gerektirebilir.

Hızlı ve kirli

İç alanları tanımlayan sınırlama kutuları belirleyebilirsiniz. Işık kutuların dışındaysa, ancak geometri (gölgede olmayan) kutunun içindeyse, ışığın bir pencereden geçirilmesinden etkilenmiş olması gerekir (geometri kutunun ve ışığın dışındaysa bu da geçerlidir içeride). Buradaki tek sorun, kutu bilgisinin gölgelendiriciye nasıl iletileceği ve ışık üzerindeki etkinin nasıl belirtildiği.

Diğer bir seçenek, pencereleri uçaklarda yatan nesneler olarak belirtmektir. İlk önce geometrinin ve ışığın düzlemin karşı taraflarında olup olmadığını ve sonra aralarındaki yolun pencerenin sınırları içindeki bir noktada düzlemle kesişip kesişmediğini test edin. Bu, ilk yönteme göre daha doğru olurdu ve farklı cam renkleri ile aynı iç mekanlara pencerelerin yerleştirilmesi daha kolay olurdu.

Pencerelerin geometrik gösterimi ile daha ayrıntılı olmaya devam edin ve daha doğru sonuçlar elde edersiniz, ancak hesaplama da daha ağırlaşır.

Bu teknikler bir koridor atıcısı için oldukça iyi çalışır, ancak dinamik veya açık bir dünya için o kadar iyi olmaz, çünkü çok fazla eser olmadan doğru görünmesi için muhtemelen çok fazla ayarlama yapılması gerekecektir. Ayrıca, bu teknikler hızlı bir şekilde biraz yoğunlaşabilir, bu nedenle ertelenmiş bir gölgeleme boru hattına taşınması tavsiye edilir.

Gölge Haritaları

Başka bir seçenek de gölge haritalamaya benzer bir şey yapmaktır.

Gölge eşlemede, bir ışıktan etkilenen dünyanın bir bitmap görüntüsünü oluşturursunuz. Her piksel, yine de bir renk olsa da, aslında en yakın saydam olmayan geometri parçasının mesafesidir (4 bayt yerine 4 float için dört bayt kullanırsınız). Işıktan bir geometri parçasına kadar olan mesafeyi hesaplarsanız ve gölge haritasındaki karşılık gelen değerden daha fazla ise, geometri parçanız gölgededir (haritayı indekslemek için genellikle geometri ve ışık arasındaki ışını kullanırsınız).

Bu fikri probleminize uygularsanız, yapacağınız şey en yakın şeffaf geometri parçasının ışığına olan mesafenin bir haritasını saklamak ve ardından o geometriden geçtikten sonra ışığın renginin ikinci bir haritasını yapmaktır ( ışık beyazsa geometrinin rengi).

Geometri parçanız bu haritadaki mesafeden daha uzaksa, harita rengini kullanın, eğer değilse o zaman orijinal açık renk kullanın.

Haritadaki her piksel için rengi hesaplama işlevi kabaca olmalıdır; lightColor - ters çevrilmişWindowColor. Böylece saf beyaz ışık ve elde ettiğimiz kırmızı spektrumun hiçbirini emmeyen saf kırmızı bir pencere için; (255,255,255) - (0,255,255) = (255,0,0). Yani diğer taraftaki ışığın rengi saf kırmızıdır. Vitray pencere gibi daha karmaşık bir saydam nesne için, malzeme rengini elde etmek üzere bir doku araması yapmak isteyebilirsiniz.

Benzer bir şey arıyorsanız Yansıtıcı Gölge Haritaları'na bakın .

Bu teknik, büyük miktarda aslına uygunluk sunar ve vitray pencereler gibi karmaşık şeffaf geometri kullanmak istiyorsanız muhtemelen en iyisi olacaktır.

Genel Bir Çözüm Deneme

Son zamanlarda, aydınlatma bilgilerini bir voksel temsilinde kodlamak popüler hale geldi (sadece geometri için değil). En son crytek motoru, gelişmiş aydınlatma ( ışık yayılım hacimleri ) için bu tür bir strataji kullanır .

İşte genel fikir:

  • Sahnenizi kapsayan eşit aralıklı küplerin bir haritasını oluşturun ( z-sırası eğrileri kullanmayı düşünün ).
  • Her voksel için olay aydınlatma bilgilerini depolamanın bir yolunu bulun (küresel harmonik gösterimler burada yararlıdır).
  • Bir ışık içeren voksel bulun ve o ışığı vokselde temsil edin.
    • Bitişik voksellerden ışığı dışarı doğru ilerletin (bir tür minecraft suyu gibi)
    • Her vokseldeki geometrinin içinden geçen ışığı nasıl etkileyeceğini hesaplayın (absorbe edin, yansıtın, iletin)
    • ışık sönene kadar tekrarlayın

Bu voksel bilgilerini oluşturmanın birçok yolu vardır, ancak yukarıdaki liste genel bir fikir vermektedir. Örneğin; gölge haritaları / birimleri oluşturarak ve sonra bu bilgileri voksel haritasına yansıtarak başlayabilirsiniz, böylece doğrudan aydınlatma haritasını hızlı bir şekilde yapabilirsiniz. Daha sonra, etkilenen bölgenin kenarı boyunca voksellerden yayılmaya başlarsınız. Bu durumda, gölge haritasını / hacmi oluştururken geometrinin şeffaf olup olmadığını göz ardı etmek isteyeceğinizi unutmayın.

Ertelenmiş bir oluşturucunun son geçişinde, bir geometri noktasının aydınlatmasını hesaplarken, uzay aydınlatmasının o noktada o noktadaki aydınlatmanın nasıl olduğunu bulmak için voksel haritanızı endekslemek için geometri konumunu kullanmanız yeterlidir. Sonra olay aydınlatma cpu tarafı bir ekran haritası oluşturabilir veya muhtemelen cuda ile yapabilirsiniz.


Uzun yazı için teşekkürler! Şu anda üzerinde çalıştığım proje için ileri ya da ertelenmiş render yapıp yapmayacağımı araştırıyorum. Şu anda ertelenecek. Pencere çok renkli olduğunda (örneğin, bir kilisede vitray) ne yapardınız?
manabreak

@manabreak - Bu harita için en iyi uyumluluk düzeyini sunacağı için gölge harita uzantısını kullanacağım. Bunu açıklamak için yazıyı düzenleyeceğim.
OriginalDaemon

Gee, teşekkürler! Bu yazı gerçekten benim günümü yaptı, muhtemelen herhangi bir yazıya bu kadar çaba sarf etmedim.
manabreak
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.