আমাকে আমার নিজস্ব সফ্টওয়্যার 3 ডি রাস্টারাইজার লিখতে হবে এবং এখনও অবধি আমি ত্রিভুজ দ্বারা তৈরি আমার 3 ডি মডেলটিকে 2 ডি স্পেসে প্রজেক্ট করতে সক্ষম হয়েছি:
আমি প্রতিটি ত্রিভুজটির 2 ডি স্পেস উপস্থাপনা পেতে আমার পয়েন্টগুলি ঘোরান, অনুবাদ করি এবং প্রজেক্ট করি। তারপরে, আমি তিনটি ত্রিভুজ পয়েন্ট নিয়েছি এবং আমি ত্রিভুজগুলির কিনারা (বাম এবং ডান) বরাবর সমস্ত পয়েন্ট [x] [y] সন্ধান করতে স্ক্যানলাইন অ্যালগরিদম (লিনিয়ার ইন্টারপোলেশন ব্যবহার করে) প্রয়োগ করি, যাতে আমি ত্রিভুজটি অনুভূমিকভাবে স্ক্যান করতে পারি, সারি সারি সারি, এবং এটি পিক্সেল দিয়ে পূরণ করুন।
এইটা কাজ করে. ব্যতীত আমাকে জেড-বাফারিংও বাস্তবায়ন করতে হবে। এর অর্থ হল যে ত্রিভুজের 3 টি শীর্ষ কোণের ঘোরানো এবং অনুবাদকৃত জেড স্থানাঙ্কগুলি জানার জন্য, আমার স্ক্যানলাইন অ্যালগরিদমের সাথে আমি যে সমস্ত পয়েন্ট পেয়েছি তার জন্য জেড স্থানাঙ্কটি অবশ্যই আমাকে বিভক্ত করতে হবে।
ধারণাটি যথেষ্ট পরিষ্কার বলে মনে হচ্ছে, আমি এই গণনাগুলির সাথে প্রথমে জা এবং জেডবিকে পাই:
var Z_Slope = (bottom_point_z - top_point_z) / (bottom_point_y - top_point_y);
var Za = top_point_z + ((current_point_y - top_point_y) * Z_Slope);
তারপরে প্রতিটি জেডপির জন্য আমি একই প্রান্তিকরণ অনুভূমিকভাবে করব:
var Z_Slope = (right_z - left_z) / (right_x - left_x);
var Zp = left_z + ((current_point_x - left_x) * Z_Slope);
এবং যদি বর্তমান জেড সেই সূচীতে আগের জেডের তুলনায় দর্শকের কাছাকাছি থাকে তবে রঙটি বাফারে রঙ লিখুন এবং জেড বাফারে নতুন জেডটি লিখুন। (আমার সমন্বিত সিস্টেমটি হল x: বাম -> ডান; y: শীর্ষ -> নীচে; জেড: আপনার মুখ -> কম্পিউটার স্ক্রিন;)
সমস্যাটি হ'ল, এটি বেঁচে আছে। প্রকল্পটি এখানে রয়েছে এবং আপনি যদি "জেড-বাফার্ড" রেডিও বোতামটি নির্বাচন করেন তবে আপনি ফলাফলগুলি দেখতে পাবেন ... ( নোট করুন যে আমি চিত্রশিল্পীর অ্যালগরিদম (কেবলমাত্র তারের ফ্রেম আঁকতে ব্যবহার করি) "জেড-বাফার্ড" মোডে ডিবাগিং উদ্দেশ্যে )
পিএস: আমি এখানে পড়েছি যে আপনি বিভক্ত z = 1/z
হওয়ার আগে আপনাকে অবশ্যই জেডগুলি অবশ্যই তাদের উপদানগুলিতে পরিণত করবে (অর্থ )। আমি চেষ্টা করেছিলাম, এবং দেখা যাচ্ছে যে কোনও পরিবর্তন নেই। আমি কী মিস করছি? (যে কেউ স্পষ্ট করে বলতে পারে, অবিকল কোথায় আপনাকে জেডকে 1 / জেডে পরিণত করতে হবে এবং কোথায় এটি ফিরিয়ে আনতে হবে?)
[সম্পাদনা] সর্বাধিক এবং সর্বনিম্ন z মানগুলি কীভাবে পাই সে সম্পর্কে এখানে কিছু তথ্য রয়েছে:
max z: 1; min z: -1; //<-- obvious, original z of the vertices of the triangles
max z: 7.197753398761272; min z: 3.791703256899924; //<-- z of the points that were drawn to screen (you know, after rotation, translation), by the scanline with zbuffer, gotten with interpolation but not 1/z.
max z: 0.2649908532179404; min z: 0.13849507306889008;//<-- same as above except I interpolated 1/z instead of z.
//yes, I am aware that changing z to 1/z means flipping the comparison in the zBuffer check. otherwise nothing gets drawn.
আমি শ্রমসাধ্য ডিবাগিংয়ে যাওয়ার আগে, কেউ কি এখনও নিশ্চিত হতে পারে যে আমার ধারণাটি এখনও সঠিক?
[EDIT2]
আমি জেড-বাফারিংয়ের সমাধান করেছি। দেখা যাচ্ছে যে, অঙ্কন ক্রমটি মোটেও গোলমাল হয়নি। Z স্থানাঙ্কগুলি সঠিকভাবে গণনা করা হচ্ছিল।
সমস্যাটি ছিল আমার ফ্রেমের হার বাড়ানোর প্রয়াসে, আমি স্ক্রিনে প্রকৃত পিক্সেলের পরিবর্তে প্রতি 4 র্থ পিক্সেল 4px / 4px বাক্স আঁকছিলাম। সুতরাং আমি প্রতি পিক্সেলটিতে 16px অঙ্কন করছিলাম তবে তাদের মধ্যে কেবল একটির জন্য জেড বাফার চেক করছি। আমি এ জাতীয় ঠাপ।
টিএল / ডিআর: প্রশ্নটি এখনও দাঁড়িয়েছে: কীভাবে / কেন / কখন আপনি জেডের পরিবর্তে জেডের পারস্পরিক ব্যবহার করতে হবে (1 / জেড হিসাবে)? কারণ এই মুহূর্তে, সবকিছুই কোনওভাবেই কাজ করে। (কোন পার্থক্য লক্ষ্য করা যায় না)।