প্রথম পদক্ষেপটি গ্রাফিক্স কার্ডটি বলা আমাদের স্টেনসিল বাফারের প্রয়োজন। আপনি গ্রাফিকস ডিভাইস ম্যানেজার তৈরি করার সময় এটি করার জন্য আমরা PreferredDepthStencil Format Depthformat.Depth24Stencil8 এ সেট করি যাতে লিখতে আসলে একটি স্টেনসিল থাকে।
graphics = new GraphicsDeviceManager(this) {
PreferredDepthStencilFormat = DepthFormat.Depth24Stencil8
};
আলফাটেষ্টএফেক্টটি সমন্বিত সিস্টেম সেট করতে এবং পিক্সেলগুলিকে আলফা দিয়ে ফিল্টার করে যা আলফা পরীক্ষায় উত্তীর্ণ হয়। আমরা কোনও ফিল্টার সেট করতে যাব না এবং ভিউ পোর্টে স্থানাঙ্ক সিস্টেম সেট করব।
var m = Matrix.CreateOrthographicOffCenter(0,
graphics.GraphicsDevice.PresentationParameters.BackBufferWidth,
graphics.GraphicsDevice.PresentationParameters.BackBufferHeight,
0, 0, 1
);
var a = new AlphaTestEffect(graphics.GraphicsDevice) {
Projection = m
};
এর পরে আমাদের দুটি ডিপথস্টেনসিল স্টেট সেট আপ করতে হবে। যখন স্প্রিটব্যাচ স্টেনসিলকে রেন্ডার করে এবং যখন স্প্রিটব্যাচ ব্যাকবফারকে রেন্ডার করে তখন এই রাজ্যগুলি নির্দেশ দেয়। আমরা প্রাথমিকভাবে দুটি ভেরিয়েবল স্টেনসিলফিউশন এবং স্টেনসিলপাসে আগ্রহী।
- স্টেনসিলফানশন নির্দেশ দেয় যখন স্প্রিটব্যাচ স্বতন্ত্র পিক্সেল আঁকবে এবং কখন সেগুলি উপেক্ষা করা হবে।
- টানা পিক্সেল পিক্সেল স্টেনসিলকে প্রভাবিত করলে স্টেনসিলপাস নির্দেশ করে।
প্রথম ডিপথস্টেনসিল স্টেটের জন্য আমরা স্টেনসিলফংশনকে তুলনা ফাংশনে সেট করি। এটি স্টেনসিলটেষ্ট সফল হওয়ার কারণ এবং যখন স্টেনসিলটেষ্ট স্প্রিটব্যাচ সেই পিক্সেলটি সরবরাহ করে। স্টেনসিলপাস স্টেনসিলপেশনে সেট করা আছে। এর অর্থ প্রতিস্থাপন করুন যে স্টেনসিলটেষ্ট সফল হলে সেই পিক্সেল রেফারেন্সস্টেনসিলের মান সহ স্টেনসিলবফারকে লেখা হবে।
var s1 = new DepthStencilState {
StencilEnable = true,
StencilFunction = CompareFunction.Always,
StencilPass = StencilOperation.Replace,
ReferenceStencil = 1,
DepthBufferEnable = false,
};
সংক্ষেপে স্টেনসিলটেষ্ট সর্বদা পাস হয়, চিত্রটি সাধারণত স্ক্রিনে টানা হয় এবং পিক্সেলের জন্য পিক্সেলগুলির জন্য 1 এর মান স্টেনসিলবফারে সংরক্ষণ করা হয়।
দ্বিতীয় ডিপথস্টেনসিল স্টেট কিছুটা জটিল। এবার আমরা কেবল তখনই স্ক্রিনে আঁকতে চাই যখন স্টেনসিলবাফারের মান হবে। এটি অর্জনের জন্য আমরা স্টেনসিলফঞ্চনটি তুলনা ফাংশন.লেসেকুয়াল এবং রেফারেন্স স্টেনসিলকে 1 এ সেট করেছিলাম This এর অর্থ হ'ল যখন স্টেনসিল বাফারের মান 1 হবে তখন স্টেনসিলটেষ্ট সফল হবে। স্টেনসিলপাসকে স্টেনসিলপেশনে সেট করা হচ্ছে। স্টেনসিলফার আপডেট না করার কারণে রাখুন। এটি আমাদের একই মুখোশ ব্যবহার করে একাধিকবার আঁকতে সহায়তা করে।
var s2 = new DepthStencilState {
StencilEnable = true,
StencilFunction = CompareFunction.LessEqual,
StencilPass = StencilOperation.Keep,
ReferenceStencil = 1,
DepthBufferEnable = false,
};
সংক্ষেপে স্টেনসিলটেষ্ট কেবল তখন পাস হয় যখন স্টেনসিলবফার 1 এর চেয়ে কম (মুখোশ থেকে আলফা পিক্সেল) থাকে এবং স্টেনসিলবফারকে প্রভাবিত করে না।
এখন আমাদের ডিপথস্টেনসিল স্টেটস সেট আপ হয়েছে। আমরা আসলে একটি মুখোশ ব্যবহার করে আঁকতে পারি। প্রথম ডিপথস্টেনসিল স্টেট ব্যবহার করে কেবল মুখোশ আঁকুন। এটি ব্যাকবফার এবং স্টেনসিলফার উভয়কেই প্রভাবিত করবে। এখন যে স্টেনসিল বাফারটির মান 0 রয়েছে যেখানে আপনার মুখোশের স্বচ্ছতা ছিল এবং 1 যেখানে এটি রঙ ধারণ করে আমরা পরবর্তী চিত্রগুলি মাস্ক করার জন্য স্টেনসিলবফার ব্যবহার করতে পারি।
spriteBatch.Begin(SpriteSortMode.Immediate, null, null, s1, null, a);
spriteBatch.Draw(huh, Vector2.Zero, Color.White); //The mask
spriteBatch.End();
দ্বিতীয় স্প্রাইটব্যাচ দ্বিতীয় ডিপথস্টেনসিল স্টেট ব্যবহার করে। আপনি যা আঁকেন তা বিবেচনা না করেই, যেখানে স্টেনসিলফার 1 সেট করা হয়েছে কেবলমাত্র পিক্সেলগুলি স্টেনসিল পরীক্ষায় উত্তীর্ণ হবে এবং স্ক্রিনে টানা হবে।
spriteBatch.Begin(SpriteSortMode.Immediate, null, null, s2, null, a);
spriteBatch.Draw(color, Vector2.Zero, Color.White); //The background
spriteBatch.End();
নীচের অঙ্কন পদ্ধতিতে কোডটির সম্পূর্ণতা, গেম কনস্ট্রাক্টরে PreferredDepthStencil Format = DepthFormat.Depth24Stencil8 সেট করতে ভুলবেন না।
GraphicsDevice.Clear(ClearOptions.Target
| ClearOptions.Stencil, Color.Transparent, 0, 0);
var m = Matrix.CreateOrthographicOffCenter(0,
graphics.GraphicsDevice.PresentationParameters.BackBufferWidth,
graphics.GraphicsDevice.PresentationParameters.BackBufferHeight,
0, 0, 1
);
var a = new AlphaTestEffect(graphics.GraphicsDevice) {
Projection = m
};
var s1 = new DepthStencilState {
StencilEnable = true,
StencilFunction = CompareFunction.Always,
StencilPass = StencilOperation.Replace,
ReferenceStencil = 1,
DepthBufferEnable = false,
};
var s2 = new DepthStencilState {
StencilEnable = true,
StencilFunction = CompareFunction.LessEqual,
StencilPass = StencilOperation.Keep,
ReferenceStencil = 1,
DepthBufferEnable = false,
};
spriteBatch.Begin(SpriteSortMode.Immediate, null, null, s1, null, a);
spriteBatch.Draw(huh, Vector2.Zero, Color.White); //The mask
spriteBatch.End();
spriteBatch.Begin(SpriteSortMode.Immediate, null, null, s2, null, a);
spriteBatch.Draw(color, Vector2.Zero, Color.White); //The background
spriteBatch.End();