git clone https://github.com/ssloy/tinyrenderer.git &&
cd tinyrenderer &&
mkdir build &&
cd build &&
cmake .. &&
cmake --build . -j &&
./tinyrenderer ../obj/diablo3_pose/diablo3_pose.obj ../obj/floor.obj
يتم حفظ الصورة المقدمة في framebuffer.tga
.
يمكنك فتح المشروع في Gitpod، وهي بيئة تطوير مجانية عبر الإنترنت لـ GitHub:
عند الفتح، سيقوم المحرر بتجميع البرنامج وتشغيله بالإضافة إلى فتح الصورة الناتجة في معاينة المحرر. ما عليك سوى تغيير الكود الموجود في المحرر وإعادة تشغيل البرنامج النصي (استخدم سجل الجهاز) لرؤية الصور المحدثة.
كود المصدر الخاص بي غير ذي صلة. اقرأ الويكي وقم بتنفيذ العارض الخاص بك. فقط عندما تعاني من كل التفاصيل الصغيرة، ستعرف ما يحدث.
في هذه السلسلة من المقالات، أريد أن أوضح كيفية عمل OpenGL من خلال كتابة نسخته (نسخة مبسطة كثيرًا). من المثير للدهشة أنني كثيرًا ما أقابل أشخاصًا لا يستطيعون التغلب على العقبة الأولية المتمثلة في تعلم OpenGL / DirectX. وهكذا، قمت بإعداد سلسلة قصيرة من المحاضرات، وبعدها أظهر طلابي عارضين جيدين جدًا.
لذلك، تمت صياغة المهمة على النحو التالي: دون استخدام مكتبات الطرف الثالث (خاصة الرسومية)، احصل على شيء مثل هذه الصورة:
تحذير: هذه مادة تدريبية من شأنها أن تكرر بنية مكتبة OpenGL بشكل غير محكم. سيكون عارض البرمجيات. لا أريد أن أوضح كيفية كتابة التطبيقات لبرنامج OpenGL. أريد أن أوضح كيف يعمل برنامج OpenGL. أنا مقتنع تمامًا بأنه من المستحيل كتابة تطبيقات فعالة باستخدام المكتبات ثلاثية الأبعاد دون فهم ذلك.
سأحاول أن أجعل الكود النهائي حوالي 500 سطر. يحتاج طلابي إلى 10 إلى 20 ساعة برمجة للبدء في إنشاء مثل هذه العارضات. عند الإدخال، نحصل على ملف اختبار بسلك متعدد الأضلاع + صور ذات مواد. في الإخراج، سوف نحصل على واجهة رسومية معروضة بدون نموذج، ويقوم البرنامج ببساطة بإنشاء صورة.
نظرًا لأن الهدف هو تقليل التبعيات الخارجية، فأنا أعطي طلابي فصلًا واحدًا فقط يسمح لهم بالعمل مع ملفات TGA. إنه أحد أبسط التنسيقات التي تدعم الصور بتنسيقات RGB/RGBA/الأبيض والأسود. لذا، كنقطة بداية، سنحصل على طريقة بسيطة للتعامل مع الصور. يجب ملاحظة أن الوظيفة الوحيدة المتاحة في البداية (بالإضافة إلى تحميل الصور وحفظها) هي القدرة على ضبط لون بكسل واحد.
لا توجد وظائف لرسم مقاطع الخطوط والمثلثات. سيتعين علينا القيام بكل هذا يدويًا. أقدم كود المصدر الخاص بي الذي أكتبه بالتوازي مع الطلاب. لكنني لا أنصح باستخدامه، لأن هذا غير منطقي. الكود بأكمله متاح على GitHub، وهنا ستجد الكود المصدري الذي أعطيه لطلابي.
# include " tgaimage.h "
const TGAColor white = TGAColor( 255 , 255 , 255 , 255 );
const TGAColor red = TGAColor( 255 , 0 , 0 , 255 );
int main ( int argc, char ** argv) {
TGAImage image ( 100 , 100 , TGAImage::RGB);
image. set ( 52 , 41 , red);
image. write_tga_file ( " output.tga " );`
return 0 ;
}
يجب أن يبدو ملفput.tga بالشكل التالي: