मैं C # और XNA का उपयोग कर रहा हूं। प्रकाश के लिए मेरा वर्तमान एल्गोरिथ्म एक पुनरावर्ती विधि है। हालांकि, यह महंगा है , उस बिंदु पर जहां हर 5 सेकंड में एक 8x128x8 चंक की गणना की जाती है।
- क्या अन्य प्रकाश विधियां हैं जो चर-अंधेरे छाया बनायेंगी?
- या पुनरावर्ती विधि अच्छी है, और शायद मैं इसे गलत कर रहा हूं?
यह सिर्फ ऐसा लगता है कि पुनरावर्ती सामान मौलिक रूप से महंगा है (प्रति चक्र लगभग 25k ब्लॉकों से गुजरने के लिए मजबूर)। मैं रे ट्रेसिंग के समान एक विधि का उपयोग करने के बारे में सोच रहा था, लेकिन मुझे नहीं पता कि यह कैसे काम करेगा। एक और बात मैंने कोशिश की कि एक सूची में प्रकाश स्रोतों को संग्रहीत किया जाए, और प्रत्येक ब्लॉक को प्रत्येक प्रकाश स्रोत से दूरी प्राप्त करने के लिए, और इसका उपयोग करके इसे सही स्तर तक प्रकाश करने के लिए, लेकिन फिर प्रकाश दीवारों के माध्यम से जाएगा।
मेरा वर्तमान पुनरावर्तन कोड नीचे है। इसे चंक में किसी भी जगह से बुलाया जाता है, जिसमें सूरज की रोशनी और रोशनी को साफ करने और फिर से जोड़ने के बाद शून्य का हल्का स्तर नहीं होता है।
world.get___at
एक ऐसा फ़ंक्शन है जो इस चंक के बाहर ब्लॉक प्राप्त कर सकता है (यह चंक क्लास के अंदर है)। Location
मेरी अपनी संरचना है जो एक की तरह है Vector3
, लेकिन फ्लोटिंग पॉइंट वैल्यू के बजाय पूर्णांक का उपयोग करता है। light[,,]
चंक के लिए लाइटमैप है।
private void recursiveLight(int x, int y, int z, byte lightLevel)
{
Location loc = new Location(x + chunkx * 8, y, z + chunky * 8);
if (world.getBlockAt(loc).BlockData.isSolid)
return;
lightLevel--;
if (world.getLightAt(loc) >= lightLevel || lightLevel <= 0)
return;
if (y < 0 || y > 127 || x < -8 || x > 16 || z < -8 || z > 16)
return;
if (x >= 0 && x < 8 && z >= 0 && z < 8)
light[x, y, z] = lightLevel;
recursiveLight(x + 1, y, z, lightLevel);
recursiveLight(x - 1, y, z, lightLevel);
recursiveLight(x, y + 1, z, lightLevel);
recursiveLight(x, y - 1, z, lightLevel);
recursiveLight(x, y, z + 1, lightLevel);
recursiveLight(x, y, z - 1, lightLevel);
}