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.