রেন্ডারটারেটে একগুচ্ছ মানগুলি সরবরাহ করতে আমার কিছুটা সমস্যা হচ্ছে। মানগুলি যে আমি চাই সেগুলিতে কখনই শেষ হয় না। মূলত আমি আমার রেন্ডারটারেটেট টেক্সচারে রেন্ডার করার জন্য একটি ফুলস্ক্রিন কোয়াড এবং একটি পিক্সেল শেডার ব্যবহার করি এবং তারপরে শেডারটিতে কিছু গণনার ভিত্তিতে টেক্সচারের স্থানাঙ্ক ব্যবহার করার ইচ্ছা করি। উপরের বাম দিকের (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] একটি রেন্ডারটারেটে পিক্সেল পর্যন্ত পরিসীমা !?