আমি কীভাবে কোনও এইচএলএসএল পিক্সেল শেডার দিয়ে NES এর বর্ণ সীমাবদ্ধতাগুলি প্রতিলিপি করতে পারি?


13

সুতরাং যেহেতু 256 রঙ মোড অবচিত হয়ে গেছে এবং ডিরেক্ট 3 ডি মোডের অধীনে আর সমর্থন করা নেই, তাই আমি সমস্ত সম্ভাব্য রঙের এনইএস প্যালেট সিমুলেট করার পরিবর্তে পিক্সেল শেডার ব্যবহার করার ধারণা পেয়েছিলাম যাতে ফিডিং অবজেক্ট এবং অ্যালফা চ্যানেলগুলির সাথে মসৃণ বিবর্ণ আউটগুলি না থাকে । (আমি জানি অবজেক্টগুলি এনইএসের কাছে সত্যিই নিস্তেজ হতে পারে না, তবে আমার কাছে এমন একটি শক্ত কালো ব্যাকগ্রাউন্ডে হ'ল এবং আস্তে আস্তে আস্তে আস্তে আস্তে আস্তে আস্তে আস্তে আস্তে আস্তে আস্তে আস্তে আস্তে আস্তে আস্তে ফেলা যায়। যা আমি জানি যে প্যালেটটি অদলবদল করেও এটি সম্ভব হয়েছিল যেহেতু এটি কয়েকটি মেগা ম্যান গেমসে হয়েছিল,

আমি এটা কিভাবে করব?


নীচের মন্তব্যে পিক্সেল শেডার ব্যবহার করে পদ্ধতির বর্ণনা দেওয়া হয়েছে, তবে কেবল আপনার আর্ট দলের জন্য উপযুক্ত স্টাইল গাইড ব্যবহার করে রঙের সীমাবদ্ধতা অর্জন করা যেতে পারে।
ইভান

আপনি কি কেবল প্যালেট হ্রাস করতে চান বা ডায়ারিং সঞ্চালন করতে চান (শেডারগুলি ব্যবহার করেও সম্ভব)। অন্যথায় zezba9000 উত্তরটি আমার কাছে সেরা বলে মনে হচ্ছে
টাইগার

আমি কেবল এনইএস প্যালেটে সম্ভাব্য রঙগুলি হ্রাস করতে চাই। মূলত আলফা চ্যানেল এর প্রভাব এবং অন্যান্য কালি প্রভাবগুলি ধরার জন্য আমার এটির প্রয়োজন ছিল কারণ 256 রঙের মোডে এটি সেগুলি ধারণ করে তবে ডাইরেক্ট 3 ডি আর 256 রঙ মোড সমর্থন করে না যাতে এতে প্রভাবগুলি সত্য রঙে ছড়িয়ে যায়।
মাইকেল অ্যালেন ক্রেন

উত্তর:


4

পিক্সেল শেডারে আপনি 256x256 টেক্সচার 2 ডি তে প্যালেট রঙগুলি দিয়ে পরিক্রমে সমস্ত অনুভূমিকভাবে আবদ্ধ থাকতে পারেন। তারপরে আপনার এনইএস অঙ্গবিন্যাসকে ডাইরেক্ট 3 ডি টেক্সচার 2 ডি তে রূপান্তর করা হবে পিক্সেল সহ 0-255 সূচক মানের রূপান্তরিত। এখানে একটি টেক্সচার ফর্ম্যাট রয়েছে যা কেবলমাত্র D3D9 এ লাল মান ব্যবহার করে। সুতরাং টেক্সচারটি কেবল পিক্সেলটিতে 8 বিট নিতে পারে তবে শেডারে যে ডেটা আসে তা 0-1 থেকে হবে।

// পিক্সেল শেডার এর মতো দেখতে পারে:

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

সম্পাদনা করুন: আরও সঠিক উপায় হ'ল টেক্সচারটিতে উল্লম্বভাবে সারিবদ্ধভাবে যুক্ত হওয়া এবং আপনার রঙিনডেক্সের 'আলফা' মানটির সাথে উল্লেখ করে:

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

তৃতীয় উপায়টি হ'ল কেবলমাত্র আলফা বর্ণের শেডিং করে NES নিম্ন বিবর্ণ মানের জাল করা:

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

আপনি যদি প্যালেটাইজেশনের পরে আলোকপাত করেন তবে সম্ভবত এটি আর কোনও NES রঙের হতে পারে না। যদি আপনি যা চান তা যদি হয় তবে তা ঠিক - তবে প্রশ্নটি যা জিজ্ঞাসা করছে তার মতো এটি শোনাচ্ছে না। 256 জিনিস হিসাবে, যদি আপনার 10 বছরেরও বেশি পুরানো জিপিইউ থাকে তবে এটি সম্ভব ... তবে এর চেয়ে আরও সাম্প্রতিক কিছু অবশ্যই 256x1 এর মতো আয়তক্ষেত্রাকার-2-টেক্সচারকে সমর্থন করবে।
নাথান রিড

যদি তিনি কেবল মসৃণ ফিডআউটগুলি না চান তবে তিনি করতে পারেন: "প্যালেট কালার.এ = (ফ্লোট) তল (প্যালেট কালার.এ * ফ্যাদকুয়ালিটি) / ফেইডকুয়েলিটি;" তিনি এমনকি থ্রিডি টেক্সচার পদ্ধতির মতো একই কাজ করতে পারেন তবে 2 ডি টেক্সচারের সাথে লাইন 4 তে পরিবর্তন করে: "ফ্লোট 4 প্যালেট কালার = টেক্স 2 ডি (প্যালেটেকচার, ফ্লোট 2 (colorIndex.x, colorIndex.a);" আলফা চ্যানেলটি বিভিন্ন প্যালেটকে কেবল সূচক করে তোলে) একক 2D টেক্সচারের স্তরগুলি
zezba9000

3

আপনি যদি টেক্সচার মেমোরির ব্যবহার সম্পর্কে সত্যিই যত্নশীল না হন (এবং একটি বিপরীতমুখী চেহারা অর্জনের জন্য একটি পাগল পরিমাণ টেক্সচার মেমোরিটি উড়িয়ে দেওয়ার ধারণাটি এক ধরণের বিকৃত আবেদন রয়েছে) আপনি আপনার নির্বাচিত প্যালেটে সমস্ত আরজিবি সংমিশ্রণে একটি 256x256x256 3 ডি টেক্সচার তৈরি করতে পারেন you । তারপরে আপনার শেডারে এটি কেবল কোডের এক লাইনে পরিণত হয়:

return tex3d (paletteMap, color.rgb);

এমনকি 256x256x256 এ যাওয়ার জন্য এটি প্রয়োজনও হবে না - 64x64x64 এর মতো কিছু যথেষ্ট হতে পারে - এবং আপনি এই পদ্ধতিটি ব্যবহার করেও ফ্লাইটে প্যালেট ম্যাপিংগুলি পরিবর্তন করতে পারেন (তবে একটি বড় গতিশীল টেক্সচার আপডেটের কারণে উল্লেখযোগ্য ব্যয়ে)।


আপনি যদি আপনার টেক্সচারে আলোকসজ্জা, আলফা-মিশ্রণ বা অন্য কোনও গণিত করতে চান তবে এটি সর্বোত্তম পদ্ধতি হতে পারে এবং তারপরে ফলাফলটি নিকটতম এনইএস রঙের সাথে স্ন্যাপ করে। তোমার মত রেফারেন্স ইমেজ ব্যবহার করে আপনার ভলিউম জমিন precompute পারে এই এক ; এটি নিকটতম-প্রতিবেশী ফিল্টারিংয়ের সাথে সেট করে, আপনি সম্ভবত 16x16x16 এর মতো ছোট কিছু নিয়ে চলে যেতে পারেন যা মোটেই বেশি স্মৃতি নয়।
নাথান রেড

1
এটি একটি দুর্দান্ত ধারণা, তবে এটি অনেক ধীর হবে এবং পুরানো হার্ডওয়্যারের সাথে সামঞ্জস্যপূর্ণ নয়। 3 ডি টেক্সচার আরও ধীর নমুনা করবে 2D এর পরে এবং 3 ডি টেক্সচারের জন্য আরও অনেক বেশি ব্যান্ডউইথ প্রয়োজন হবে যা এটি আরও ধীর করে দেবে। আরও নতুন কার্ডগুলি এটি বিবেচনা করে না, তবে এখনও।
zezba9000

1
আপনি কত বছর যেতে চান তা নির্ভর করে। আমি বিশ্বাস করি 3 ডি টেক্সচার সমর্থনটি মূল জিফর্স 1 এ ফিরে যায় - 14 বছর বয়স কি যথেষ্ট?
ম্যাক্সিমাস মিনিমাস

লল আচ্ছা হ্যাঁ তারা সম্ভবত করেন, এই কার্ডগুলি কখনও ব্যবহার করেন নি, অনুমান করুন আমি ফোন জিপিইউ'র সাথে আরও ইনলাইন ভাবছিলাম। আজ প্রচুর লক্ষ্যবস্তুতে 3 ডি টেক্সচার সমর্থন নেই। তবে তিনি ডি 3 ডি ব্যবহার করছেন এবং ওপেনজিএল অনুমান করেন না এমনকি ডাব্লুপি 8 এটি সমর্থন করে this তবুও একটি 3 ডি টেক্সচার আরও 2 ব্যান্ডউইদথ গ্রহণ করবে one
zezba9000

1

(আমার উভয় সমাধান কেবল তখনই কাজ করে যদি আপনি ছায়ার গোছের সাহায্যে ফ্লাইতে প্যালেটগুলি পরিবর্তন করার বিষয়ে চিন্তা করেন না)

আপনি যেকোন ধরণের টেক্সচার ব্যবহার করতে পারেন এবং শেডারটিতে কেবল একটি সাধারণ গণনা করতে পারেন। কৌশলটি হ'ল আপনার প্রয়োজনের তুলনায় আরও রঙিন তথ্য রয়েছে, তাই আপনি যা চান তা চান না এমন তথ্য থেকে আপনি মুক্তি পাবেন।

8 বিটের রঙ ফর্মাল আরআরআরজিজিবিবিতে রয়েছে । যা আপনাকে 8 টি শেড লাল এবং সবুজ এবং নীল 4 টি শেড দেয়।

এই সমাধানটি যে কোনও আরজিবি (এ) রঙিন বিন্যাসের টেক্সচারের জন্য কাজ করবে।

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);
}

দ্রষ্টব্য: আমি এটি আমার মাথার শীর্ষ থেকে লিখেছি, তবে আমি সত্যিই নিশ্চিত যে এটি আপনার জন্য সংকলন এবং কাজ করবে


আর একটি সম্ভাবনা , D3DFMT_R3G3B2 টেক্সচার ফর্ম্যাটটি ব্যবহার করা হবে যা 8 বিট গ্রাফিক্সের মতোই actually আপনি যখন এই টেক্সচারে ডেটা রাখেন, আপনি বাইট প্রতি সাধারণ বিট অপারেশন ব্যবহার করতে পারেন।

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

এটি একটি ভাল উদাহরণ। কেবলমাত্র আমি মনে করি রঙ রঙের প্যালেটটি তার বদলে নেওয়া দরকার ছিল। সেক্ষেত্রে তাকে আমার উদাহরণের মতো কিছু ব্যবহার করতে হবে।
zezba9000

এটি মোটেও NES রঙের প্যালেট নয়। এনইএস 8 বিট আরজিবি ব্যবহার করেনি, এটি ওয়াইপিবিপিআর স্পেসে প্রায় 50 থেকে 60 রঙের একটি নির্দিষ্ট প্যালেট ব্যবহার করেছিল।
সাম হোচেভার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.