मैं एचएलएसएल पिक्सेल शेडर के साथ एनईएस की रंग सीमाओं को कैसे दोहरा सकता हूं?


13

इसलिए जब से 256 रंग मोड को हटा दिया गया है और अब Direct3D मोड के तहत समर्थित नहीं है, तो मुझे सभी संभावित रंगों के एनईएस पैलेट को अनुकरण करने के बजाय एक पिक्सेल शेडर का उपयोग करने का विचार मिला, ताकि लुप्त हो रही वस्तुएं और क्या न हो, अल्फा चैनलों के लिए चिकनी फीका नहीं हो। । (मुझे पता है कि ऑब्जेक्ट्स वास्तव में NES पर फीका नहीं कर सकते हैं, लेकिन मेरे पास सभी ऑब्जेक्ट्स हैं जो ठोस ब्लैक बैकग्राउंड पर और बाहर फीका करते हैं, जो पैलेट स्वैपिंग के साथ संभव होगा। इसके अलावा, स्क्रीन तब और बाहर फ़ेड करता है जब आप पॉज़ करते हैं। जो मुझे पता है कि पैलेट स्वैपिंग के साथ भी संभव था क्योंकि यह कुछ मेगा मैन गेम्स में किया गया था।) समस्या यह है, मुझे पता है कि एचएलएसएल शेडर्स के बारे में कुछ भी नहीं है।

मैं यह कैसे करुं?


नीचे दी गई टिप्पणी पिक्सेल शेडर का उपयोग करते हुए दृष्टिकोण का वर्णन करती है, लेकिन बस इस तरह की रंग सीमा आपकी कला टीम के लिए एक उपयुक्त शैली गाइड का उपयोग करके प्राप्त की जा सकती है।
इवान

क्या आप केवल पैलेट को कम करना चाहते हैं या डिटेरिंग भी करना चाहते हैं (संभव है कि शेड्स का उपयोग करके भी)। अन्यथा zezba9000 उत्तर मुझे सबसे अच्छा लगता है
tigrou

मैं सिर्फ NES पैलेट में संभावित रंगों को कम करना चाहता हूं। मुझे मुख्य रूप से अल्फा चैनल प्रभाव और अन्य स्याही प्रभावों को पकड़ने की आवश्यकता थी क्योंकि 256 रंग मोड में यह उन्हें पकड़ता है, लेकिन Direct3D अब 256 रंग मोड का समर्थन नहीं करता है, इसलिए इसमें प्रभाव को सही रंगों में चिकना किया जाता है।
माइकल एलन ने

जवाबों:


4

पिक्सेल shader में आप 256x256 Texture2D में पैलेट रंगों के साथ पंक्तिबद्ध होकर क्षैतिज रूप से पंक्तिबद्ध हो सकते हैं। फिर आपके NES बनावट को डायरेक्ट 3 डी Texture2Ds में बदल दिया जाएगा, जिसमें कभी भी 0-255 इंडेक्स वैल्यू में पिक्सेल बदले जाएंगे। एक बनावट प्रारूप है जो केवल डी 3 डी 9 में लाल मूल्य का उपयोग करता है। तो बनावट केवल पिक्सेल प्रति 8bit तक ले जाएगी, लेकिन छाया में आने वाला डेटा 0-1 से होगा।

// पिक्सेल shader इस तरह लग सकता है:

float4 mainPS() : COLOR0
{
    float4 colorIndex = tex2D(MainTexture, uv);
    float4 palletColor = tex2D(PalletTexture, float2(colorIndex.x, 0);
    return palletColor;
}

संपादित करें: एक और सही तरीका यह होगा कि आप सभी सम्मिश्रण पैलेट संस्करण में जोड़ दें जो आपको बनावट में लंबवत रूप से संरेखित करें और उन्हें अपने colorIndex के 'अल्फ़ा' मान से संदर्भित करें:

float4 mainPS() : COLOR0
{
    float4 colorIndex = tex2D(MainTexture, uv);
    float4 palletColor = tex2D(PalletTexture, float2(colorIndex.x, colorIndex.a);
    return palletColor;
}

एक तीसरा तरीका सिर्फ एनईएस कम फीका गुणवत्ता नकली नकली रंग अल्फा रंग द्वारा किया जाएगा:

float4 mainPS() : COLOR0
{
    float4 colorIndex = tex2D(MainTexture, uv);
    float4 palletColor = tex2D(PalletTexture, float2(colorIndex.x, 0);
    palletColor.a = floor(palletColor.a * fadeQuality) / fadeQuality;
    //NOTE: If fadeQuality where to equal say '3' there would be only 3 levels of fade.
    return palletColor;
}

1
आपका मतलब है 256x1, 256x256 नहीं, मैं अनुमान लगा रहा हूं? इसके अलावा, दोनों बनावट पर बिलिनियर फ़िल्टरिंग को अक्षम करना सुनिश्चित करें, अन्यथा आप पैलेट "प्रविष्टियों" के बीच सम्मिश्रण करेंगे।
नाथन रीड

इसके अलावा, आप इस योजना के साथ बनावट मूल्यों पर किसी भी प्रकार की प्रकाश व्यवस्था या कोई गणित नहीं कर सकते हैं, क्योंकि आप जो कुछ भी करते हैं वह आपको पैलेट के पूरी तरह से अलग हिस्से में भेजने की संभावना है।
नाथन रीड

@ नथन रीड आप लाइटिंग कर सकते हैं। आप अपने रंग मूल्य को वापस करने से पहले बस "पैलेटकॉलर" पर प्रकाश की गणना करें। इसके अलावा आप एक 256x1 बनावट बना सकते हैं, लेकिन हार्डवेयर बस हुड उपयोग 256x256 के तहत हो सकता है और 256x256 सबसे हार्डवेयर पर उपयोग करने के लिए सबसे तेज़ आकार है। जब तक कि आईडी बदल न जाए।
zezba9000

यदि आप पैलेटाइजेशन के बाद लाइटिंग करते हैं तो यह संभवत: एनईएस रंगों में से एक भी नहीं होगा। यदि आप चाहते हैं कि, यह ठीक है - लेकिन यह ध्वनि की तरह नहीं है जो सवाल पूछ रहा था। 256 चीज़ों के लिए, यह संभव है यदि आपके पास 10 वर्ष से अधिक पुराना जीपीयू है ... लेकिन इससे अधिक हाल ही में कुछ भी निश्चित रूप से आयताकार पावर -2 के बनावट का समर्थन करेगा, जैसे 256x1।
नाथन रीड

अगर वह सिर्फ चिकनी फीकाआउट नहीं चाहता है, तो वह कर सकता है: "पैलेटकॉलर.ए = (फ्लोट) फ्लोर (पैलेटकोलर. ए * फैडेक्वेलिटी) / फैडक्वेलिटी;" वह 3 डी बनावट विधि के रूप में भी एक ही काम कर सकता था, लेकिन 4 वीं पंक्ति को बदलकर 2 डी बनावट के साथ: "फ्लोट 4 पैलेटकॉर्टर = टेक्स 2 डी (पैलेटटेक्चर, फ्लोट 2 (colorIndex.x, colorIndex.a);" अल्फा चैनल सिर्फ अलग-अलग फूस को अनुक्रमित करता है। एक भी 2 डी बनावट पर परतें।
zezba9000

3

यदि आप वास्तव में बनावट स्मृति उपयोग के बारे में परवाह नहीं करते हैं (और रेट्रो लुक प्राप्त करने के लिए बनावट स्मृति की एक पागल राशि उड़ाने का विचार एक प्रकार की विकृत अपील है) तो आप अपने चयनित पैलेट में सभी RGB संयोजनों को 256x256x256 3D बनावट मैपिंग का निर्माण कर सकते हैं । फिर आपकी छाया में यह अंत में कोड की एक पंक्ति बन जाती है:

return tex3d (paletteMap, color.rgb);

256x256x256 पर सभी तरह से जाने के लिए भी आवश्यक नहीं हो सकता है - 64x64x64 जैसा कुछ पर्याप्त हो सकता है - और आप इस विधि का उपयोग करके मक्खी पर पैलेट मैपिंग भी बदल सकते हैं (लेकिन एक बड़े गतिशील बनावट अपडेट के कारण महत्वपूर्ण लागत पर)।


यह सबसे अच्छा तरीका हो सकता है अगर आप अपने बनावट पर प्रकाश, अल्फा-सम्मिश्रण या किसी अन्य प्रकार के गणित करना चाहते हैं, और फिर अंतिम परिणाम को निकटतम एनईएस रंग में स्नैप करें। आप इस तरह एक संदर्भ छवि का उपयोग कर अपनी मात्रा बनावट precompute सकता है ; यह निकटतम-पड़ोसी फ़िल्टरिंग पर सेट होने के साथ, आप 16x16x16 के रूप में छोटे से कुछ के साथ अच्छी तरह से दूर हो सकते हैं, जो सभी के लिए बहुत स्मृति नहीं होगी।
नातान रीड

1
यह एक अच्छा विचार है, लेकिन यह बहुत धीमा होगा और पुराने हार्डवेयर के अनुरूप नहीं होगा। 3 डी बनावट बहुत धीमी गति से नमूना होगा तो 2 डी वाले और 3 डी बनावट को भी अधिक बैंडविड्थ की आवश्यकता होगी जो इसे और भी धीमा कर देगा। नए हालांकि इस अभ्यस्त बात कार्ड, लेकिन अभी भी।
zezba9000

1
निर्भर करता है कि आप कितने साल के लिए जाना चाहते हैं। मेरा मानना ​​है कि 3 डी बनावट का समर्थन मूल GeForce 1 पर वापस चला जाता है - 14 साल का पर्याप्त है?
मैक्सिमस मिनिमस

लोल वेल हाँ शायद वे करते हैं, कभी भी उन कार्ड का उपयोग नहीं करते हैं, मुझे लगता है कि मैं फोन जीपीयू के साथ अधिक इनलाइन सोच रहा था। आज बहुत सारे लक्ष्य हैं जिनमें 3 डी बनावट का समर्थन नहीं है। लेकिन क्योंकि वह D3D का उपयोग कर रहा है और OpenGL का अनुमान नहीं है यहां तक ​​कि WP8 भी इसका समर्थन करता है। अभी भी एक 3 डी बनावट अधिक बैंडविड्थ तो एक 2 डी एक को ले जाएगा।
zezba9000

1

(मेरे दोनों समाधान केवल तभी काम करते हैं, जब आप शेड का उपयोग करके मक्खी पर पैलेट बदलने के बारे में परवाह नहीं करते हैं)

आप किसी भी प्रकार की बनावट का उपयोग कर सकते हैं और एक shader पर बस एक साधारण गणना कर सकते हैं। ट्रिक यह है कि आपके पास जरूरत से ज्यादा रंग की जानकारी है, इसलिए आप केवल उस जानकारी से छुटकारा पा लेंगे जो आप नहीं चाहते हैं।

8bit का रंग फॉर्म RRRGGGBB में है । जो आपको लाल और हरे रंग के 8 और नीले रंग के 4 शेड देता है।

यह समाधान किसी भी RGB (A) रंग प्रारूप बनावट के लिए काम करेगा।

float4 mainPS() : COLOR0
{
    const float oneOver7 = 1.0 / 8.0;
    const float oneOver3 = 1.0 / 3.0;

    float4 color = tex2D(YourTexture, uvCoord);
    float R = floor(color.r * 7.99) * oneOver7;
    float G = floor(color.g * 7.99) * oneOver7;
    float B = floor(color.b * 3.99) * oneOver3;

    return float4(R, G, B, 1);
}

नोट: मैंने लिखा है कि मेरे सिर के ऊपर से, लेकिन वास्तव में यकीन है कि यह आपके लिए संकलन और काम करेगा


एक और संभावना , डी 3 डीएफएमटी_ आर 3 जी 3 बी 2 बनावट प्रारूप का उपयोग करना होगा जो वास्तव में 8 बिट ग्राफिक्स के समान है। जब आप इस बनावट में डेटा डालते हैं, तो आप प्रति बिट सरल ऑपरेशन का उपयोग कर सकते हैं।

tex[index] = (R & 8) << 5 + ((G & 8) << 2) + (B & 4);

यह एक अच्छा उदाहरण है। केवल मुझे लगता है कि उसे रंग पैलेट को स्वैप करने में सक्षम होना चाहिए। उस स्थिति में उसे मेरे उदाहरण की तरह कुछ का उपयोग करना होगा।
zezba9000

यह एनईएस रंग पैलेट बिल्कुल नहीं है। NES ने 8-बिट RGB का उपयोग नहीं किया, इसने YPbPr स्पेस में लगभग 50 से 60 रंगों के एक निश्चित पैलेट का उपयोग किया।
sam hocevar
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.