Minecraftian Dünyasında Aydınlatma


10

Minecraft büyük ölçüde bir yükseklik haritasına dayanan ve heigtmap bilgisini dünyaya ışıkla akıtmak için kullanan bir oyundur. Anladığım kadarıyla, yükseklik haritasındaki en yüksek nokta, güneş ışığından etkilenen alanın sonu. Yukarıdaki her şey güneş ışığıyla aydınlatılır, altındaki her şey 8 blok yarıçapındaki yakındaki ışıktan etkilenir.

Eğer dünyanızın tepesinde yüzen bir ada varsa, bunun altındaki her şey aslında bir mağara olarak görülecektir. İki ışık aynı noktayı etkilediğinde daha parlak ışık kazanır (bundan emin değildir).

Her iki şekilde de minecrafts aydınlatma modeli ile ilgili birkaç sorun var: her şeyden önce, dünyanızın bir yükseklik haritası yoksa, güneş ışığını tam olarak neyin yayması ve neyin yayılmaması gerektiğini anlamak daha zor hale gelir. Basit bir yol, dünyanın (benim durumumda) yüzen bir kaya olduğunu varsaymak ve daha sonra her ekseni her iki yönden de geçmek ve kayanın nerede başladığını ve bittiğini bulmak olacaktır. Ancak bu, kayadaki eziklerin karanlıkta olmaması gerektiği için sorunu tamamen ortadan kaldırmaz.

Minecraft, bir bloğun malzemesi hakkındaki bilgilerle birlikte parçalarındaki ışık bilgilerini önbelleğe alacaktır. Bu yüzden sadece dünya değiştirilirse aydınlatma güncellenmelidir. Ne yazık ki bu süreç güncellemelerde hala oldukça yavaş ve hızlı ışık değişikliklerinde aydınlatma gecikmesini görebilirsiniz. Bu, özellikle bir çok blok değiştiğinde (TNT, gün batımı vb.) Ve en hızlı bilgisayarı (Veya Mac'te Java) çalıştırmıyorsanız doğrudur.

3D grafik aydınlatma konusundaki sınırlı anlayışımdan, minecraft gibi bir dünya en büyük sorun olmamalı. Sorunu nasıl çözersiniz?

Bence bir voksel dünyasında aydınlatma için temel şartlar

  1. tek bir karede gerçekleşebilecek kadar hızlı güncelleyin. Grafik cihazda ışıklandırma yapılabilir ve değiştirilen ışık bilgileri ana RAM'e indirilebilir.
  2. ana oyun mantığı için ışık bilgileri hızlı bir şekilde mevcut olmalıdır, bu yüzden tamamen grafik cihazına dayanmamalıdır: akıl yürütme: ışık çimlerin büyümesini, canavarların yumurtlamasını vb. etkiler.
  3. hafif güncellemelerin bir yığın için yerel olması veya başka bir sınıra sahip olması gerekir, böylece çok büyük olabilecek tüm dünyayı yeniden sevmek zorunda kalmazsınız.

Ana fikir, ışık güncellemelerini hızlı yapmak, daha güzel olması gerekmez. Genel ışık oluşturma performans iyileştirmeleri için SSAO kolayca eklenebilir ve bunun üzerine çok daha güzel dünyalarla sonuçlanabilir.

Yanıtlar:


7

Minecraft'ta aydınlatma asenkron olarak hesaplanır ve geometriye pişirilir. Gerçek zamanlı olarak yapılmaz.

Her voksel, o voksel için aydınlatmayı, muhtemelen tek bir bayt olarak depolar (veya 2, çentik, gündüz ve gece döngülerini mümkün kılmak için katmanlı bir yaklaşım kullanır). Sadece 16 ışık seviyesi vardır. Dünyayı aydınlatmak için Minecraft 2 geçiş yapar. Biri güneş ışığı için, diğeri ise ışığı mağaralara ya da buralara yaymak için. Aydınlatma lokalizedir, çünkü herhangi bir ışık kaynağı ışığını en fazla 16 blok ötede yayabilir. Su ve lav neredeyse aynı şekilde çalışır.

Blogunda daha fazla bilgi var: http://notch.tumblr.com/post/434902871/per-request-this-is-how-the-new-lighting-will-work


Biliyorum. Sanırım yukarıda yazdım (eksi parlaklık 4 bit çözünürlük).
Armin Ronacher

1

GPU Render to Texture ve sonuçlarınızı iki kez arabelleğe kullanamazsınız, böylece her kareyi yeniden okumak için her zaman hesaplanmış aydınlatma bilgilerine sahip olursunuz?

Bu verileri aydınlatma için nasıl düzenleyeceğiniz tamamen size bağlıdır, ancak tek yapmanız gereken aydınlatma algoritmanızın hızını artırmaksa, neden araştırma için ilk seçenek olmaması gerektiğini anlamıyorum?


Tam olarak ne düşünüyordum. Hemen hemen tüm GPU'lar, çoğu CPU'dan farklı olarak, bu tür büyük paralel hesaplama alıştırması için TASARLANMIŞTIR.
Grant Peters

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.