- यह एक ऐसा प्रोजेक्ट है जिसमें Game Boy Color पर रियल-टाइम 3D shading लागू की गई है, और खिलाड़ी प्रकाश की कक्षा को नियंत्रित करते हुए वस्तु को घुमा सकता है
- normalized vectors और Lambert shading (dot product) की गणना के आधार पर, spherical coordinates का उपयोग करके ऑपरेशन को सरल बनाया गया है
- multiplication instruction के बिना SM83 CPU की सीमाओं को पार करने के लिए log transform और lookup tables का उपयोग किया गया, और 8-bit precision पर गणना की गई
- self-modifying code का उपयोग करके लगभग 10% performance improvement हासिल किया गया, और प्रति frame 15 tiles render किए गए
- AI की मदद से code generation के अधिकांश प्रयास विफल रहे, और मुख्य algorithm व shader को सीधे हाथ से लिखे गए code से पूरा किया गया
प्रोजेक्ट का अवलोकन
- Game Boy Color पर रियल-टाइम में image render करने वाला game बनाया गया
- खिलाड़ी कक्षा-आकार की रोशनी को नियंत्रित करते हुए वस्तु को घुमाता है
- पूरा code GitHub repository(nukep/gbshader) में सार्वजनिक है
3D बनाने की प्रक्रिया
- शुरुआती lookdev के लिए Blender का उपयोग किया गया, और दृश्य परिणाम संतोषजनक होने पर प्रोजेक्ट आगे बढ़ाया गया
- Cryptomatte और custom shader का उपयोग करके normal map बनाया गया
- teapot model में camera को घुमाकर PNG sequence के रूप में normal map output किया गया
- Game Boy Color model के screen हिस्से को अलग scene में render करके बाद में composite किया गया
गणितीय आधार
- normal map को हर pixel के normal vector को encode करने वाले vector field के रूप में उपयोग किया गया
- Lambert shading को
v = N·L रूप के dot product से गणना किया गया
- spherical coordinates में बदलकर इसे
v = sinNθ sinLθ cos(Nφ−Lφ) + cosNθ cosLθ रूप में सरल बनाया गया
- सभी vectors के लिए radius r=1 मानकर गणना की मात्रा घटाई गई
Game Boy पर implementation
- Lθ (प्रकाश का vertical angle) को स्थिर constant रखा गया, और Lφ (प्रकाश का rotation angle) को ही खिलाड़ी नियंत्रित करता है
- ROM में हर pixel को
(Nφ, log(m), b) रूप में store किया गया
- multiplication instruction की अनुपस्थिति को हल करने के लिए log transform और lookup tables (
log, pow) का उपयोग किया गया
- negative operations को support करने के लिए sign bit को upper bit में store किया गया
- सभी scalar values को -1.0~+1.0 range के 8-bit fraction के रूप में व्यक्त किया गया
- addition linear space में, जबकि multiplication log space में किया गया
- denominator के रूप में 127 का उपयोग किया गया ताकि ±1 दोनों को व्यक्त किया जा सके
cos_log और मुख्य गणना
cos_log एक combined lookup है जो log(cos x) रूप में काम करता है, और multiplication को log addition से बदल देता है
- प्रति pixel गणना मात्रा
- 1 subtraction, 1
cos_log lookup, 1 addition, 1 pow lookup, 1 addition
- कुल 3 additions/subtractions और 2 lookups
प्रदर्शन
- प्रति frame 15 tiles प्रोसेस किए जाते हैं, और कुछ खाली rows को इससे भी तेज़ी से गणना किया जा सकता है
- प्रति pixel लगभग 130 cycles लगते हैं, जबकि खाली row में 3 cycles लगते हैं
- CPU का लगभग 89% shader calculations में उपयोग होता है, और बाकी input व I/O processing में
Self-Modifying Code
- प्रति frame लगभग 960 pixels को प्रोसेस करने वाले मुख्य loop को optimize करने के लिए instructions को ही modify किया गया
- constants को सीधे code में डालकर variable load की तुलना में तेज़ operation किया गया
- उदाहरण:
sub a, 8, sub a, variable की तुलना में 12 cycles तेज़ है
- कुल मिलाकर लगभग 11,520 cycles (10%) की बचत हुई
AI उपयोग के प्रयास
- पूरे प्रोजेक्ट का 95% हिस्सा हाथ से लिखा गया
- AI को Game Boy assembly (SM83) लिखने में कठिनाई हुई
- AI का उपयोग
- Python: OpenEXR layers पढ़ना
- Blender: scene automation scripts
- SM83: कुछ function snippets (जैसे VRAM DMA)
- विफल प्रयास
- AI से shader assembly code generate कराने की कोशिश → अक्षम और कई त्रुटियों वाला परिणाम
- Claude Sonnet 4 model की मदद से pseudocode से assembly generate करने की कोशिश की गई
- कुछ हिस्सा काम किया, लेकिन धीमा था और Z80 व SM83 को गड़बड़ करने जैसी त्रुटियाँ हुईं
- अंतिम code को हाथ से पूरी तरह फिर से लिखा गया
निष्कर्ष और सीख
- AI साधारण scripts के लिए उपयोगी हो सकती है, लेकिन सटीकता और verification अनिवार्य हैं
- OpenEXR processing code में AI ने channel order error (BGR vs RGB) पैदा किया, जिससे कई हफ्तों तक bug बना रहा
- अनुभव से यह सीख सामने आई कि “AI का उपयोग करते समय verification सबसे महत्वपूर्ण है”
- इस प्रोजेक्ट को legacy hardware की सीमाओं को पार करने वाले एक प्रयोगात्मक shader implementation के उदाहरण के रूप में देखा जा सकता है
अभी कोई टिप्पणी नहीं है.