একটি পূর্ণস্ক্রিন কোয়াড সহ একটি রেন্ডাররেটে পিক্সেল-নিখুঁত রেন্ডারিং


9

রেন্ডারটারেটে একগুচ্ছ মানগুলি সরবরাহ করতে আমার কিছুটা সমস্যা হচ্ছে। মানগুলি যে আমি চাই সেগুলিতে কখনই শেষ হয় না। মূলত আমি আমার রেন্ডারটারেটেট টেক্সচারে রেন্ডার করার জন্য একটি ফুলস্ক্রিন কোয়াড এবং একটি পিক্সেল শেডার ব্যবহার করি এবং তারপরে শেডারটিতে কিছু গণনার ভিত্তিতে টেক্সচারের স্থানাঙ্ক ব্যবহার করার ইচ্ছা করি। উপরের বাম দিকের (0,0) থেকে নীচে ডান কোণে (1,1) কোয়াডের টেক্সচারের স্থানাঙ্কগুলি ... সমস্যাটি হ'ল, দ্বিখণ্ডনের পরে, এই মানগুলি পিক্সেল শেডারে পৌঁছায় না ।

একটি উদাহরণ: আমি একটি 4x4 টেক্সচারকে রেন্ডার করি এবং এই ক্ষেত্রে শেডার কেবল লাল এবং সবুজ চ্যানেলগুলিতে টেক্সচারের স্থানাঙ্কগুলি (ইউ, ভি) আউটপুট করে:

return float4(texCoord.rg, 0, 1);

আমি যা থেকে বেরিয়ে যেতে চাই তা একটি টেক্সচার যেখানে উপরের বাম দিকের পিক্সেলটি আরজিবি (0,0,0) এবং এইভাবে কালো, উপরের ডানদিকে পিক্সেলটি আরজিবি (255,0,0) এবং এইভাবে একটি উজ্জ্বল লাল এবং নীচে বামে পিক্সেলটি হ'ল আরজিবি (0,255,0) - একটি উজ্জ্বল সবুজ।

যাইহোক, পরিবর্তে আমি ডান এটি এখানে পেতে:

(সোজা চতুর্দিকে রেন্ডারিং, কোনও সংশোধন নেই)
কোয়াডের সরাসরি উপস্থাপনা, কোনও সংশোধন প্রয়োগ করা হয়নি

উপরের বাম পিক্সেলটি কালো, তবে আমি কেবল অন্য কোণগুলিতে তুলনামূলকভাবে গা dark় লাল এবং গা green় সবুজ পেয়েছি। তাদের আরজিবি মানগুলি (191,0,0) এবং (0,191,0)। আমি দৃ strongly়ভাবে সন্দেহ করি এটি কোয়াডের স্যাম্পলিং অবস্থানগুলির সাথে করার আছে: উপরের বাম পিক্সেলটি কোয়াডের উপরের বাম কোণকে সঠিকভাবে নমুনা দেয় এবং ইউভি স্থানাঙ্ক হিসাবে (0,0) পায় তবে অন্য কোণার পিক্সেলগুলি নমুনা দেয় না কোয়াডের অন্য কোণগুলি। আমি বাম চিত্রটিতে এটি নীল বাক্সের সাথে কোয়াড এবং সাদা বিন্দুগুলি উপরি নমুনা স্থানাঙ্কের প্রতিনিধিত্ব করে চিত্রিত করেছি।

আমি এখন অর্ধ পিক্সেল অফসেট সম্পর্কে জানি যে ডাইরেক্ট 3 ডি 9-এ স্ক্রিন-প্রান্তিককরণ কোয়াড্ডারগুলি সরবরাহ করার সময় আপনার স্থানাঙ্কগুলিতে আপনার আবেদন করা উচিত। এর থেকে আমি কী ধরণের ফলাফল পেয়েছি তা দেখুন:

(ডিএক্স 9 এর অর্ধ পিক্সেল অফসেট দিয়ে রেকর্ড করা কোয়াড)
অর্ধ পিক্সেল অফসেট সহ কোয়াড রেন্ডার হয়েছে

লাল এবং সবুজ উজ্জ্বল হয়ে উঠেছে তবে এখনও সঠিক নয়: 223 আমি লাল বা সবুজ রঙের চ্যানেলে সর্বাধিক পাওয়া। তবে এখন, আমার আর খাঁটি কালোও নেই, বরং আরজিবি (32,32,0) এর সাথে গা dark়, হলুদ বর্ণের ধূসর!

আমার আসলে যা দরকার তা হ'ল এই ধরণের রেন্ডারিং:

(লক্ষ্য রেন্ডার, কোয়াড আকার হ্রাস)
খাঁটি কৃষ্ণাঙ্গ, শাকসবুজ এবং সঠিক সংক্ষেপণের সাথে লালগুলি

দেখে মনে হচ্ছে প্রথম চিত্রের তুলনায় আমাকে আমার কোয়াডের ডান এবং নীচের সীমানাটি ঠিক এক পিক্সেল উপরে এবং বাম দিকে সরাতে হবে। তারপরে ডান কলাম এবং পিক্সেলের নীচের সারিটি যথাযথভাবে কোয়াডের সীমানা থেকে UV স্থানাঙ্কগুলি পান:

VertexPositionTexture[] quad = new VertexPositionTexture[]
{
    new VertexPositionTexture(new Vector3(-1.0f,  1.0f, 1f), new Vector2(0,0)),
    new VertexPositionTexture(new Vector3(1.0f - pixelSize.X,  1.0f, 1f), new Vector2(1,0)),
    new VertexPositionTexture(new Vector3(-1.0f, -1.0f + pixelSize.Y, 1f), new Vector2(0,1)),
    new VertexPositionTexture(new Vector3(1.0f - pixelSize.X, -1.0f + pixelSize.Y, 1f), new Vector2(1,1)),
};

তবে এটি বেশ কার্যকর হয়নি এবং নীচের এবং ডান পিক্সেলগুলিকে মোটেও রেন্ডার না করার কারণ ঘটেছে। আমি মনে করি এই পিক্সেলগুলির কেন্দ্রগুলি আর কোয়াডের আওতায় নেই এবং এভাবে শেডার দ্বারা প্রক্রিয়াজাত করা হবে না। যদি আমি কোয়াডটিকে একটি ক্ষুদ্র পরিমাণ আরও বড় করে তুলতে কিছু ক্ষুদ্র পরিমাণ দ্বারা পিক্সেল সাইজের গণনা পরিবর্তন করি তবে তা কমপক্ষে কাজ করে ... কমপক্ষে 4x4 টেক্সচারে। এটি ছোট টেক্সচারগুলিতে কাজ করে না এবং আমি আশঙ্কা করি এটি বড় আকারের টেক্সচারের উপর uv মানগুলির এমনকি বিতরণকে সুস্পষ্টভাবে বিকৃত করে:

Vector2 pixelSize = new Vector2((2f / textureWidth) - 0.001f, (2f / textureHeight) - 0.001f);

(আমি পিক্সেল আকারের গণনাটি 0.001f দ্বারা পরিবর্তন করেছি - ছোট টেক্সচারের জন্য, যেমন 1D লক টেবিলগুলি, এটি কাজ করে না এবং আমাকে এটি 0.01f বা আরও বড় কিছু করতে হবে)

অবশ্যই এটি একটি তুচ্ছ উদাহরণ এবং আমি পিক্সেল কেন্দ্রগুলিতে ইউভিগুলি ম্যাপিংয়ের চিন্তা না করেই সিপিইউতে খুব সহজেই এই গণনাটি করতে পারতাম ... তবুও, আসলে একটি পূর্ণ, সম্পূর্ণ রেন্ডার করার একটি উপায় থাকতে হবে [0, 1] একটি রেন্ডারটারেটে পিক্সেল পর্যন্ত পরিসীমা !?


এটি কোনও সাহায্যের নয়, তবে আমার ঠিক একই সমস্যা হচ্ছে।
IUsedToBeAPygmy

1
লিনিয়ার স্যাম্পলিংটিও অক্ষম করতে ভুলবেন না।
r2d2rigo

এটি যে স্থানাঙ্ক সিস্টেমটি আপনি ব্যবহার করছেন এটি স্ক্রিনের পিক্সেলের সাথে মেলে - দেখে মনে হচ্ছে আপনি এখানে কেবল 2 × 2 পিক্সেল আঁকছেন। প্রথম সমস্যার সমাধান আমি হ'ল প্রকল্পটি পাওয়া এবং মডেলভিউ ম্যাট্রিকগুলি এমন আকারযুক্ত যে স্থানাঙ্কের জায়গায় +1 স্ক্রিনে 1 পিক্সেলের একটি স্থানান্তর।
স্লিপ ডি। থম্পসন

উত্তর:


4

আপনার সমস্যাটি হল যে ইউভিগুলি টেক্সচারের স্থানাঙ্ক হিসাবে ডিজাইন করা হয়েছে। 0,0 এর সমন্বয় হ'ল টেক্সচারের শীর্ষ বাম পিক্সেলের উপরের বাম কোণে, যা আপনি সাধারণত টেক্সচারটি পড়তে চান না not 2 ডি এর জন্য আপনি সেই পিক্সেলের মাঝখানে টেক্সচারটি পড়তে চান।

আমার গণিতগুলি যদি সঠিক হয় তবে আপনার কাজটি করার জন্য যা করা দরকার তা হ'ল:

return float4((texCoord.rg - (0.5f/textureSize)) * (textureSize/(textureSize-1)), 0, 1);

এটি হ'ল আপনি শীর্ষ বাম পিক্সেলটি 0,0 এ পেতে উপযুক্ত অফসেট বিয়োগ করুন এবং তারপরে নীচের ডানটি সঠিক হতে স্কেল প্রয়োগ করুন।

0-1 ব্যাপ্তির বাইরে জ্যামিতির জন্য UV স্থানাঙ্কগুলি প্রসারিত করে একই জিনিস অর্জন করা যেতে পারে।


শেষ বাক্যটি বিস্তারিতভাবে বর্ণনা করার জন্য: আপনি এই ট্রান্সফর্মেশনটি ইউভিগুলিতে কোয়াডের চার কোণার জন্য ভার্টেক্স বাফারে প্রয়োগ করতে পারেন, তারপরে পিক্সেল শেডারে করুন return float4(texCoord.rg, 0, 1);
নাথান রিড

আমি উপরের প্রস্তাবিত সূত্রটি চেষ্টা করেছিলাম এবং এটি কার্যকরভাবে কার্যকর হয়নি: উপরে থেকে আমার 4x4 নমুনা রেন্ডাররেটে আমি আর, জি, চ্যানেলগুলিতে 0, 42, 127 এবং 212 পেয়েছি, বাম থেকে ডান বা উপরে নীচে। তবে, আমি সমান দুরত্বের পদক্ষেপগুলিতে 0 থেকে 255 পর্যন্ত মান চাই (4x4 টেক্সচারের জন্য 0, 85, 170 এবং 255 হবে)। আমি ইউভি স্থানাঙ্কগুলিও পাল্টানোর চেষ্টা করেছি, তবে এখনও সঠিক অফসেটটি খুঁজে পাইনি।
মারিও

0

দেখে মনে হচ্ছে প্রথম চিত্রের তুলনায় আমাকে আমার কোয়াডের ডান এবং নীচের সীমানাটি ঠিক এক পিক্সেল উপরে এবং বাম দিকে সরাতে হবে।

প্রায়, তবে পিক্সেলের মাত্র অর্ধেক। আপনার কোয়াড শীর্ষে মাত্র 0.5 বিয়োগ করুন। যেমন আপনি একই টেক্সচার সহ 256x256 কোয়াড চান, আপনার পয়েন্টগুলি এখানে:

p1 = (-0.5, -0.5)
p2 = (-0.5, 255-0.5)
p3 = (255-0.5, 255-0.5)
p4 = (255-0.5, -0.5)

অথবা, আপনি এর পরিবর্তে পিক্সেল শেডারে টেক্সেলটির অর্ধেক যোগ করতে পারেন (টেক্সকোর্ড.আরজি + 0.5 * (1.0 / টেক্সট সাইজ))

অর্ধ পিক্সেল অফসেটটি ডিএক্স 9-এ একটি পরিচিত তথ্য। এটি এবং এই নিবন্ধগুলি আপনাকে পাশাপাশি সহায়তা করতে পারে।


0

এটি অবশ্যই লিনিয়ার স্যাম্পলিংয়ের কারণে ঘটছে। আপনি যদি টেক্সেলগুলি ডানদিকে এবং পূর্ণ-কালো শীর্ষ-বাম পিক্সেলের নীচে দেখেন, আপনি দেখতে পাবেন যে তাদের আর এবং এবং / বা জি চ্যানেলগুলিতে 63 আছে, এবং তাদের 2 টি বিতে 2 আছে এখন দেখুন কাদা-গা dark়-হলুদ আপনি পান; এটি আর-জি-তে 31 এবং বি-তে 1 That's এটি অবশ্যই 2x2 গ্রুপের উপরে গড় টেক্সেলগুলির ফলস্বরূপ, তাই সমাধানটি আপনার টেক্সচার ফিল্টারটি নির্দেশ করে।


-2

এটি হ'ল বিচ্যুয়েজ আপনি টেক্সটর্ডসটি ভার্টেক্স আউটপুট থেকে ব্যবহার করছেন যা ভার্টেক্স শ্যাডার প্রক্রিয়াকরণের পরে হার্ড ড্রাইভ দ্বারা বিভক্ত হয়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.