আমি একটি মেগামান- মতো খেলায় কাজ করছি যেখানে রানটাইমের সময় আমাকে নির্দিষ্ট পিক্সেলের রঙ পরিবর্তন করতে হবে। রেফারেন্সের জন্য : মেগামানে আপনি যখন আপনার নির্বাচিত অস্ত্রটি পরিবর্তন করেন তারপরে নির্বাচিত অস্ত্রকে প্রতিফলিত করার জন্য প্রধান চরিত্রের প্যালেট পরিবর্তন হয়। স্প্রাইটের সমস্ত রঙ পরিবর্তন হয় না, কেবলমাত্র কিছু নির্দিষ্টরকমই করে ।
এই জাতীয় প্রভাবটি এনইএস-তে সাধারণ ও করণীয় ছিল যেহেতু প্রোগ্রামার প্যালেটটিতে পিক্সেল এবং প্যালেট সূচকগুলির মধ্যে লজিক্যাল ম্যাপিং অ্যাক্সেস করেছিল। আধুনিক হার্ডওয়্যারের ক্ষেত্রে, যদিও এটি কিছুটা চ্যালেঞ্জিং কারণ প্যালেটগুলির ধারণাগুলি এক নয়।
আমার সমস্ত টেক্সচার 32-বিট এবং প্যালেটগুলি ব্যবহার করবেন না।
আমি চাই যে প্রভাবটি অর্জন করতে পারি তার দুটি উপায় আছে, তবে এই প্রভাবটি সহজেই অর্জন করার আরও ভাল উপায় থাকলে আমি আগ্রহী। আমি যে দুটি বিকল্প সম্পর্কে জানি তা হ'ল:
- "প্যালেট অদলবদল" আচরণ সম্পাদন করতে একটি শেডার ব্যবহার করুন এবং কিছু জিএলএসএল লিখুন।
- যদি শেডারগুলি উপলভ্য না থাকে (বলুন, কারণ গ্রাফিক্স কার্ড তাদের সমর্থন করে না) তবে "মূল" টেক্সচারগুলি ক্লোন করা এবং প্রাক-প্রয়োগযুক্ত রঙ পরিবর্তন সহ বিভিন্ন সংস্করণ উত্পন্ন করা সম্ভব।
আদর্শভাবে আমি একটি শেডার ব্যবহার করতে চাই কারণ এটি সোজা মনে হয় এবং ডুপ্লিকেটড-টেক্সচার পদ্ধতির বিপরীতে সামান্য অতিরিক্ত কাজ প্রয়োজন। আমি উদ্বেগ প্রকাশ করি যে কেবলমাত্র রঙগুলিতে ডুপ্লিকেট করা টেক্সচারগুলি ভিআরএএম নষ্ট করে দিচ্ছে - আমি কি এই বিষয়ে চিন্তা করব না?
সম্পাদনা করুন : আমি গৃহীত উত্তরের কৌশলটি ব্যবহার করে শেষ করেছি এবং এখানে আমার রেফারেন্সের শেডার।
uniform sampler2D texture;
uniform sampler2D colorTable;
uniform float paletteIndex;
void main()
{
vec2 pos = gl_TexCoord[0].xy;
vec4 color = texture2D(texture, pos);
vec2 index = vec2(color.r + paletteIndex, 0);
vec4 indexedColor = texture2D(colorTable, index);
gl_FragColor = indexedColor;
}
উভয় টেক্সচার 32-বিট, এক টেক্সচারটি বিভিন্ন প্যালেট সমেত লুপ লুক টেবিল হিসাবে ব্যবহৃত হয় যা সমস্ত একই আকার (আমার ক্ষেত্রে 6 টি রঙ)। আমি রঙ টেবিলের সূচক হিসাবে উত্স পিক্সেলের লাল চ্যানেলটি ব্যবহার করি। এটি মেগামানের মতো প্যালেট অদলবদল করার জন্য কব্জির মতো কাজ করেছে!