स्लाइड 3 में से एक पर "डायरेक्टएक्स 11 बैटलफील्ड 3 में रेंडरिंग" पावरपॉइंट मैंने फ़ॉउलिंग कोड पर ध्यान दिया:
struct Light {
float3 pos; float sqrRadius;
float3 color; float invSqrRadius;
}
मुझे समझ में नहीं आता है कि वे केवल त्रिज्या के भंडारण के बजाय वर्ग त्रिज्या और यहां तक कि उलटा वर्ग (जो मेरा मानना है कि 1 वर्ग त्रिज्या है) को क्यों संग्रहीत करेंगे? वे इस डेटा का उपयोग अपनी संगणना में कैसे कर रहे हैं? इसके अलावा, शंकु और लाइन रोशनी के बारे में क्या? यह संरचना केवल बिंदु रोशनी के लिए होनी चाहिए, मैं इसे अन्य प्रकारों के लिए काम नहीं कर सकता - पर्याप्त डेटा नहीं है। फिर भी मुझे यह जानकर अच्छा लगेगा कि वे उस वर्ग और इनस्वक्वेयर का उपयोग कैसे करते हैं।
अद्यतन: ठीक है, मैं अंत में मिल गया।
यहाँ क्लासिक प्रकाश क्षीणन समीकरण है, आसानी से नेट पर पाया जाता है:
float3 lightVector = lightPosition - surfacePosition;
float attenuation = saturate(1 - length(lightVector)/lightRadius);
यह length(lightVector)
वास्तव में यह कर रहा है के रूप में अपेक्षाकृत महंगा है:
length(lightVector) = sqrt(dot(lightVector, lightVector);
इसके अलावा विभाजन ऑपरेशन (/lightRadius)
भी काफी महंगा है।
इस तरह से प्रकाश क्षीणन की गणना करने के बजाय, आप इसे निम्न तरीके से गणना कर सकते हैं, जो बहुत तेज़ होगा:
attenuation = saturate(1 - dot(lightVector, lightVector)*invRadiusSqr);
जहाँ invRadiusSqr को CPU स्तर पर पूर्व-संगणित किया जा सकता है और एक shader स्थिरांक के रूप में पारित किया जाता है।
इसके अलावा, आपको परिणाम के रूप में एक द्विघात प्रकाश क्षीणन प्राप्त होता है (पूर्व मामले में रैखिक के बजाय), जो और भी बेहतर है, क्योंकि IRL प्रकाश में द्विघात फलन है।
आपकी मदद के लिए सभी को शुक्रिया!