मैं एक मेगामन -जैसी गेम पर काम कर रहा हूं, जहां मुझे रनटाइम के दौरान कुछ पिक्सल्स का रंग बदलना होगा। संदर्भ के लिए : मेगामैन में जब आप अपने चयनित हथियार को बदलते हैं तो चयनित हथियार को प्रतिबिंबित करने के लिए मुख्य चरित्र के पैलेट में परिवर्तन होता है। स्प्राइट के सभी रंग नहीं बदलते हैं, केवल कुछ लोग ही करते हैं ।
NES पर इस तरह का प्रभाव आम और काफी आसान था क्योंकि प्रोग्रामर की पैलेट तक पहुँच थी और पिक्सल और पैलेट सूचकांकों के बीच तार्किक मैपिंग थी। आधुनिक हार्डवेयर पर, हालांकि, यह थोड़ा अधिक चुनौतीपूर्ण है क्योंकि पैलेट की अवधारणा समान नहीं है।
मेरे सभी बनावट 32-बिट हैं और पैलेट का उपयोग नहीं करते हैं।
मेरे द्वारा चाहा जाने वाले प्रभाव को प्राप्त करने के दो तरीके हैं, लेकिन अगर मुझे इस प्रभाव को आसानी से प्राप्त करने के लिए बेहतर तरीके हैं तो मैं उत्सुक हूं। मेरे द्वारा चुने गए दो विकल्प हैं:
- "पैलेट स्वैपिंग" व्यवहार करने के लिए एक shader का उपयोग करें और कुछ GLSL लिखें।
- यदि शेड्स उपलब्ध नहीं हैं (कहते हैं, क्योंकि ग्राफिक्स कार्ड उनका समर्थन नहीं करता है) तो "मूल" बनावट को क्लोन करना संभव है और पूर्व-लागू रंग परिवर्तन के साथ विभिन्न संस्करणों को उत्पन्न करना संभव है।
आदर्श रूप से मैं एक शेडर का उपयोग करना चाहूंगा क्योंकि यह सीधा लगता है और डुप्लिकेट-बनावट पद्धति के विपरीत थोड़े अतिरिक्त काम की आवश्यकता होती है। मुझे चिंता है कि उनमें सिर्फ एक रंग बदलने के लिए बनावट की नकल करना वीआरएएम को बर्बाद कर रहा है - क्या मुझे इसके बारे में चिंता नहीं करनी चाहिए?
संपादित करें : मैं स्वीकृत उत्तर की तकनीक का उपयोग करके समाप्त हो गया और यहां संदर्भ के लिए मेरी छायादार है।
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 रंग)। मैं रंग तालिका में एक इंडेक्स के रूप में स्रोत पिक्सेल के लाल चैनल का उपयोग करता हूं। इसने मेगामैन जैसी पैलेट स्वैपिंग को प्राप्त करने के लिए एक आकर्षण की तरह काम किया!