কিভাবে ভালো কিছু সম্পর্কে?
আপনার টাইলের স্প্রিটকে টুকরো টুকরো করে আপনার আলো আঁকবেন না। আপনার আনলিট টাইলসকে রেন্ডার টার্গেটে আঁকুন , তারপরে টাইলের লাইটগুলি দ্বিতীয় রেন্ডার টার্গেটে আঁকুন , প্রতিটি একটিকে টাইলের ক্ষেত্রফলকে গ্রেজস্কেল আয়তক্ষেত্র হিসাবে উপস্থাপন করুন। চূড়ান্ত দৃশ্যটি রেন্ডার করতে, দুটি রেন্ডার লক্ষ্যগুলি একত্রিত করতে একটি শেডার ব্যবহার করুন, দ্বিতীয়টির মান অনুযায়ী প্রথমটির প্রতিটি পিক্সেল গা dark় করে।
এটি এখন আপনার কাছে যা ঠিক তা তৈরি করবে। এটি আপনাকে সাহায্য করে না, সুতরাং আসুন এটি কিছুটা পরিবর্তন করুন।
আপনার লাইটম্যাপ রেন্ডার টার্গেটের মাত্রাগুলি পরিবর্তন করুন যাতে প্রতিটি টাইল একটি আয়তক্ষেত্রাকৃতির ক্ষেত্রের পরিবর্তে একক পিক্সেল দ্বারা উপস্থাপিত হয়। চূড়ান্ত দৃশ্যটি রচনা করার সময়, রৈখিক ফিল্টারিংয়ের সাথে একটি নমুনা পরিস্থিতি ব্যবহার করুন। অন্যথায় সমস্ত কিছু একই রাখুন।
ধরে নিই যে আপনি আপনার শেডারটি সঠিকভাবে লিখেছেন লাইট ম্যাপটি কার্যকরভাবে মিশ্রনের সময় "স্কেল আপ" হওয়া উচিত। এটি আপনাকে গ্রাফিক্স ডিভাইসের টেক্সচার স্যাম্পলারের মাধ্যমে বিনামূল্যে একটি দুর্দান্ত গ্রেডিয়েন্ট এফেক্ট দেবে।
আপনি শেডারটি কাটাতে এবং 'অন্ধকার' ব্লেন্ডস্টেটের সাহায্যে আরও সহজেই এটি করতে সক্ষম হতে পারেন, তবে আপনাকে নির্দিষ্ট করে দেওয়ার আগে আমার এটি পরীক্ষা করে নিতে হবে।
হালনাগাদ
সত্যই এটি উপহাস করার জন্য আমার আজ কিছু সময় ছিল। উপরের উত্তরটি আমার প্রত্যেকের প্রথম উত্তর হিসাবে শেডারগুলি ব্যবহার করার অভ্যাস প্রতিফলিত করে তবে এই ক্ষেত্রে সেগুলি আসলে প্রয়োজনীয় নয় এবং তাদের ব্যবহার অযথাই জিনিসগুলিকে জটিল করে তোলে।
আমি যেমন পরামর্শ দিয়েছি, আপনি কাস্টম ব্লেন্ডস্টেট ব্যবহার করে ঠিক একই প্রভাব অর্জন করতে পারেন। বিশেষত, এই কাস্টম ব্লেন্ডস্টেট:
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)
আমাদের কাস্টম ব্লেন্ডস্টেটের সাথে তাই হয়ে যায়
result = (lightmapColor * destinationColor) + (0)
যার অর্থ খাঁটি সাদা রঙের এক উত্সের রঙ (1, 1, 1, 1) গন্তব্য রঙটি সংরক্ষণ করবে, খাঁটি কালো রঙের একটি উত্স রঙ (0, 0, 0, 1) গন্তব্যটির রঙকে বিশুদ্ধ কালো করে গাen় করবে এবং যে কোনও মাঝের ধূসর ছায়া গোছের পরিমাণে গন্তব্য রঙটি গাen় করবে।
এটি ব্যবহারে আনতে প্রথমে আপনার লাইটম্যাপ তৈরি করতে যা যা করা দরকার তা করুন:
var lightmap = GetLightmapRenderTarget();
তারপর শুধু আপনার আঁকা unlit স্বাভাবিক backbuffer সরাসরি দৃশ্য:
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();
এটি উত্স রঙ (লাইটম্যাপ) দ্বারা গন্তব্য রঙ (আনলিট টাইলস )কে গুণিত করবে, যথাযথভাবে অন্লিট টাইলগুলি গাening় করে তুলবে এবং লাইটম্যাপ টেক্সচারটি প্রয়োজনীয় আকার পর্যন্ত পরিমাপ করার ফলে একটি গ্রেডিয়েন্ট প্রভাব তৈরি করবে।