इस जैसे किसी और के बारे में क्या राय है?
अपने टाइल स्प्राइट को टिन्ट करके अपनी लाइटिंग न बनाएं। रेंडर टारगेट के लिए अपनी अनलिमिटेड टाइल्स को ड्रा करें , फिर टाइल लाइट को दूसरे रेंडर टारगेट पर ड्रा करें , हर एक को टाइल वाले क्षेत्र को कवर करते हुए ग्रेस्केल आयत के रूप में दर्शाएं। अंतिम दृश्य को प्रस्तुत करने के लिए, दो रेंडर लक्ष्यों को संयोजित करने के लिए एक शेडर का उपयोग करें, दूसरे के मूल्य के अनुसार पहले के प्रत्येक पिक्सेल को गहरा करना।
यह वही पैदा करेगा जो अभी आपके पास है। यह आपकी मदद नहीं करता है, तो चलो इसे थोड़ा बदल दें।
अपने लाइटमैप रेंडर टारगेट के आयामों को बदलें ताकि प्रत्येक टाइल एक आयताकार क्षेत्र के बजाय एकल पिक्सेल द्वारा दर्शाई जाए । अंतिम दृश्य कंपोज़ करते समय, रैखिक फ़िल्टरिंग के साथ एक नमूना स्थिति का उपयोग करें। नहीं तो बाकी सब वही छोड़ दो।
यह मानते हुए कि आपने अपने शेडर को सही ढंग से लिखा है, कंपोजिंग के दौरान लाइटमैप प्रभावी ढंग से "स्केल्ड अप" होना चाहिए। यह आपको ग्राफिक्स डिवाइस की बनावट के नमूने के माध्यम से मुफ्त में एक अच्छा ढाल प्रभाव प्राप्त करेगा।
तुम भी shader बाहर कटौती करने में सक्षम हो सकता है और यह और अधिक बस एक 'darkening' BlendState के साथ, लेकिन इससे पहले कि मैं आपको बारीकियों दे सकता है मैं इसके साथ प्रयोग करना होगा।
अपडेट करें
मेरे पास आज कुछ समय था कि मैं वास्तव में इसका मजाक उड़ाऊं। ऊपर दिया गया उत्तर मेरी हर चीज़ के पहले उत्तर के रूप में शेड्स का उपयोग करने की मेरी आदत को दर्शाता है, लेकिन इस मामले में वे वास्तव में आवश्यक नहीं हैं और उनका उपयोग अनावश्यक रूप से चीजों को जटिल बनाता है।
जैसा कि मैंने सुझाव दिया, आप कस्टम ब्लेंडस्टेट का उपयोग करके ठीक उसी प्रभाव को पूरा कर सकते हैं। विशेष रूप से, यह कस्टम ब्लेंडस्टेट:
BlendState Multiply = new BlendState()
{
AlphaSourceBlend = Blend.DestinationAlpha,
AlphaDestinationBlend = Blend.Zero,
AlphaBlendFunction = BlendFunction.Add,
ColorSourceBlend = Blend.DestinationColor,
ColorDestinationBlend = Blend.Zero,
ColorBlendFunction = BlendFunction.Add
};
सम्मिश्रण समीकरण है
result = (source * sourceBlendFactor) blendFunction (dest * destBlendFactor)
तो हमारे कस्टम BlendState के साथ, यह बन जाता है
result = (lightmapColor * destinationColor) + (0)
जिसका अर्थ है कि शुद्ध सफेद (1, 1, 1, 1) का स्रोत रंग गंतव्य रंग को संरक्षित करेगा, शुद्ध काले रंग का स्रोत रंग (0, 0, 0, 1) शुद्ध रंग को काला कर देगा, और कोई भी बीच में भूरे रंग की छाया एक मद्धम राशि से गंतव्य का रंग गहरा कर देगी।
इसे व्यवहार में लाने के लिए, अपना लाइटमैप बनाने के लिए सबसे पहले आपको जो करना है वह करें:
var lightmap = GetLightmapRenderTarget();
फिर अपने बैकलाइट दृश्य को सीधे बैकबफ़र की ओर आकर्षित करें जैसा कि आप सामान्य रूप से करेंगे:
spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend);
/* draw the world here */
spriteBatch.End();
फिर कस्टम ब्लेंडस्टेट का उपयोग करके लाइटमैप बनाएं:
var offsetX = 0; // you'll need to set these values to whatever offset is necessary
var offsetY = 0; // to align the lightmap with the map tiles currently being drawn
var width = lightmapWidthInTiles * tileWidth;
var height = lightmapHeightInTiles * tileHeight;
spriteBatch.Begin(SpriteSortMode.Immediate, Multiply);
spriteBatch.Draw(lightmap, new Rectangle(offsetX, offsetY, width, height), Color.White);
spriteBatch.End();
यह गंतव्य रंग (टाइलें) को स्रोत रंग (लाइटमैप) से गुणा करेगा, उचित रूप से अनलिमिटेड टाइल्स को गहरा कर देगा, और लाइटमैप बनावट के आवश्यक आकार तक स्केल होने के कारण एक ढाल प्रभाव पैदा करेगा।