Table of Contents
بنیادها: نمایندگی از فضای سه نفره
قبل از اینکه یک پیکسل منفرد کشیده شود، یک موتور 3D باید یک زبان ریاضی برای توصیف اشیاء در فضا داشته باشد.در هسته (FLT:0: (سه جزء که نشان دهنده موقعیت، جهت یا رنگ است) و matrices (4×4 آرایه که کدگذاری می کند، به طور معمول این تغییرات ساده است:
- [در این میان] برای امتیازها و و بردارها [و]
- [FLT 1 ] برای تغییر در رشته های بزرگ ذخیره شده در ستون
هر شی از تشکیل شده است مثلث توسط سه علامت تعریف شده است، هر کدام با یک موقعیت و به طور اختیاری یک آرایه طبیعی و رنگی را به عنوان آرایه های درهم تنیده (به عنوان مثال، برای مکعب) بهبود بهره وری حافظه - یک توجه انتقادی هنگامی که شما بعداً هزاران صورت را در هر فریم قرار می دهید.
خط لوله گرافیکی: از Vertics تا Pixels
یک خط لوله گرافیکی یک توالی از مراحل است که داده های صحنه 3D را به یک تصویر 2D تبدیل می کند.در یک موتور پایه نرم افزار، شما به صورت دستی هر مرحله را پیاده سازی می کنید:
- [[۱] [۱۰] پردازش [FLT: ۱] - استفاده از مدل، مشاهده و پیش بینی تغییر می کند.
- (FLT 1: 1) - تبدیل مثلث به قطعات (کلیدهای بالقوه)
- [[۱] [۱۰] [۱۰] [۱۰]] [۱]] [۱]]] - رنگ هر تکه را بر اساس نور و ماده محاسبه کنید.
- [[۱] [۱۰] [۱]] [۱۰] [۱]] [۱]]] - مخلوط کردن قطعات با بافر قاب، از جمله تست عمق.
موتورهای سخت افزاری (با استفاده از OpenGL، Vulkan یا DirectX) بیشتر این مراحل را بر روی GPU انجام می دهند، اما درک مسیر نرم افزار به شما بینش عمیق در مورد چگونگی عملکرد GPU تحت کاپوت می دهد.
پردازش و تحول Vertex
هر کدام از این آیات در قرآن کریم به صورت مستقیم به صورت زیر است: «وَهَاَنْمَهَاَهَاَهَهَاَهَهَهَاًَهَهَهُواً» (وَهُمْهُمَهُمْهُمَهُمْهُمَهُوا وَهُوا وَهُمْهُمْهُوا مِهُوا وَهُوا مِهُوا مِهُوا مِهُوا مِنْمْمْهُوا مِهُمْمْمْمْمْهُوا مِنْهُمْمْمْمْهُواِهُواِهُواِهُواِنْهُمْمْهُواِنْمْهُواِنَهُواِنْهُواِنَهُمْهُواِنَهُواِنْهُواِنَهُواِنَهُواِ
در C، توابع تحول مانند:
- [FLT3] - یک ماتریس هویتی را باز می گرداند.
- ایجاد یک ماتریس ترجمه.
- [در این میان]، [۵] [۵] [۵] [۱] [۵] [۵] [۵] [۱] [۵] [۱] [۵] [۵] [۱] [۵] [۵] [۵] [۵] [۱] [۵] [۱] [۱] [۱] [۱] [۱] [۵] [۱] [۵] [۵] [۳] [۳] [۵] [۳] [۵] [۵] [۵] [۳] [۱] [۵] [۱] [۵] [۵] [۵] [۵] [۱] [۳] [۵] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۳] [۱] [۳] [۵] [۱] [۱] [۵] [۳] [۵] [۳] [۳] [۱] [۱] [۱] [۱] [۱] [۱] [۱] [۳] [۳] [۳] [۳] [۳] [۳] [۳] [۱] [۱] [۳] [۱] [
- - چند برابر یک ماتریس 4×4 توسط یک بردار 4 ( مختصات موموژن).
معادل سایه های اندکس در نرم افزار بر روی تمام سرگیجه ها، چند برابر هر یک از طریق ماتریس ترکیب شده (FLT:7) و ذخیره نتیجه در یک بافر وان تبدیل شده است.
پروژه: چشم انداز در مقابل Orthographic
Projection کنترل می کند که عمق در صفحه نمایش (FLT:0) پیش بینی دقیق (FLT:1) چگونه نشان داده می شود، اشیاء دور کوچکتر به نظر می رسد، ایجاد واقعیت گرایی آن از زمینه دید، نسبت ابعاد، نزدیک و دور از آن هواپیماهای کلیپ سازی ساخته شده است: فرمول کلاسیک شامل تقسیم x و y قطعات توسط z (پس از ضرب ماتریس در C، شما پیش بینی ماتریس و استفاده مجدد از آن است:
- - یک ماتریس چشم انداز استاندارد را باز می گرداند.
] پیش بینی جغرافیایی خطوط موازی را حفظ می کند و ساده تر است، برای UI یا ابزار CAD استفاده می شود.
دانلود بازی Rasterization: پر کردن مثلث
پس از پیش بینی، شما مختصات صفحه نمایش 2D (مانند موقعیت پیکسل) و مقدار عمق (z) دارید، Rasterization هر مثلث را به قطعاتی که مختصات پیکسل صحیح را پوشش می دهند تقسیم می کند. الگوریتم کلاسیک (FLT:0) تبدیل خط ::
- سه علامت مثلث را با مختصات y مرتب کنید.
- پیاده روی در لبه های چپ و راست، محاسبه مرزهای x برای هر خط اسکن.
- برای هر پیکسل در محدوده افقی، عمق قطعه را با تقسیم شدن در سراسر مثلث محاسبه کنید.
- در این مرحله، آزمونی را با دقت و با دقت و در صورت لزوم به صورت زیر به صورت زیر انجام دهید.
پیاده سازی الگوریتم پیاده روی لبه به طور موثر در C نیاز به حلقه های تنگ و دقیق استفاده از حساب ثابت نقطه ثابت برای جلوگیری از سربار نقطه شناور است. بسیاری از موتورهای سرگرمی با یک رویکرد brute-force (checking هر پیکسل در جعبه اتصال) و سپس بهینه سازی با معادلات لبه شروع می کنند.
سایه و روشنایی
یک موتور ساده مسطح از یک رنگ در هر مثلث استفاده می کند، محاسبه شده از صورت طبیعی و یک منبع نور واحد (FLT:0 مدل فشرده می دهد: در C، شما طبیعی را به عنوان محصول متقابل از دو لبه (پس از تبدیل سرگیجه به جهان)، شدت نور ضرب می کند.
برای اضافه کردن عمق، پیاده سازی سایه (هر دو عادی، تقسیم شده در قطعات) و یا / 2Phong سایه (طبیعی کم پیکسل)) دومی نیاز به تقسیم موقعیت های جهانی و نرمال، سپس نور محاسباتی در هر قطعه - اما نتایج به طور چشمگیری بهتر است.
ساخت موتور در C: مراحل عملی
بیایید از طریق ساخت یک موتور حداقل نرم افزار 3D از ابتدا راه برویم. هدف این است که یک مکعب چرخ دار با نورپردازی محیط و پخش بر روی یک پنجره پیکسل 640×480 ایجاد کنیم.
مرحله 1 – تنظیم یک Pixel Buffer
یک بافر حافظه را برای فریم و عمق تعریف کنید: و ، کادر را به سیاه و بافر عمق به 1.0 (هواپیمای دور) هر فریم روشن کنید.
مرحله ۲ – تعریف داده های صحنه
برای یک مکعب، شش صورت (12 مثلث) نیاز به 12×3 = 36 سرگیجه دارند.آنها را در یک آرایه از ساختار با موقعیت (3 شناور) و رنگ (3 شناور برای RGB) ذخیره می کند. پیش از آن 8 گوشه مکعب منحصر به فرد و شش رنگ صورت را از یک بافر برای جلوگیری از تکرار سرگیجه استفاده کنید.
مرحله 3 - خط لوله تحول
هر فریم، ماتریس مدل را از زاویه (به عنوان مثال، چرخش (زمان))، ماتریس دید از یک دوربین ثابت که به دنبال مبدا است، محاسبه کنید و ماتریس پیش بینی آنها را به یک ماتریس MVP واحد تقسیم کنید: LT] هر یک از اندکس ها را با ضرب و شتم (F3) تغییر دهید، سپس چشم انداز (اید xide xyz، با استفاده از پردازش طبیعی (F1:3) را به هماهنگی دستگاه z 1 - 1 - 1 - 1 - 1 - 1 - 0.
مرحله ۴ – راستریزه کردن و Shade
برای هر مثلث، از روش اسکن استفاده کنید در حالی که پیکسل پیاده روی، عمق را تقسیم می کند و همچنین یک ویژگی هر دواب مانند موقعیت جهانی فضا (برای Phong) یا سرگیجه طبیعی (برای Gour) را به کار می گیرد.
مرحله 5 - نمایش
از SDL (Simple DirectMedia Layer) یا کتابخانه ای مشابه برای ایجاد یک پنجره و روشن کردن کادر استفاده کنید، برای مثال، با SDL2: [FLT16]، ، در [FLT 19]، سپس و هر فریم.
این مسیر نرم افزاری بر روی CPU اجرا می شود، بنابراین عملکرد به چند هزار مثلث در هر فریم محدود می شود، هنگامی که راحت باشد، می توانید لایه تراریزه را با OpenGL جایگزین کنید، کار سنگین را به GPU کاهش دهید و در عین حال تبدیل و منطق صحنه خود را در C نگه دارید.
بهینه سازی موتور شما
یک موتور پایه آهسته است. چندین بهینه سازی برای عملکرد زمان واقعی ضروری است:
- پشت سر تکان دادن: مثلث اسکی که نرمال آن از دوربین دور می شود، منطقه امضا شده مثلث پیش بینی شده (در 2D) را تکمیل کنید یا محصول dot صورت را با جهت دید طبیعی بررسی کنید.
- [FLT1] [FLT1] آزمایش جعبه اتصال یک شی در برابر شش هواپیمای از دید frustum اگر کاملاً خارج از آن، کل شی را از بین ببرد.
- محاسبه نقطه ای: عملیات شناور با ریاضی صحیح را در حلقه های سخت تر بازسازی جایگزین کنید، بسیاری از سازندگان موتور از 16.16 نقطه ثابت برای تداخل خط اسکن استفاده می کنند.
- پیش از انتقال حافظه: [FLT 1] از تبدیل همان اندکس چندین بار با تبدیل تمام سرگیجه های یک بار، سپس با استفاده از شاخص ها اجتناب کنید.
- [[۱] [۱۰] [۱] [۱۰] [۱]] [۱۰]] [۱]] [۱] [۱]]) در کتاب «بک» (چپ به راست، بالا به پایین) بنویسید تا به حداکثر رساندن ضربه های کش دست یابید.
این تکنیک ها می توانند رندر کننده نرم افزار را از 3 تا 5fps تا 60fps برای صحنه های پیچیدگی متوسط (به عنوان مثال چند صد مثلث) فشار دهند.
گسترش موتور
هنگامی که یک پایه محکم وجود دارد، می توانید ویژگی های خود را به صورت فزاینده ای اضافه کنید:
- نقشه برداری: تصاویر 2D را ذخیره و مختصات UV را در سراسر مثلث ها تقسیم کنید.
- [[۱] [۱۰] [۱۰] [۱۰] [۱۰] [۱]] [۱]] [۱] [۱]] [۱] [۱]] [۱]] [۱] [۱]] [۱]] [۱]] [۱] [۱]] [۱] [۲]] [۱]] [۱]] [۲]] [۲]]] [۲] [۲]]] [۳] [۳]]] [۳] [۳] [۳] [۳]]]]] [۳] [۳]]]] [۳]]] [۲] [۳]] [۳]]]]]]]]]]] [۳] [۳] [۳] [۱] [۳] [۳] [۳] [۳] [۳] [۱] [۱] [۳]] [۳] [۱] [۳] [۳] [۱]]]] [۳] [۱]]] [۱] [۱] [بر [۳] [۳] [۳] [۳] [۳]]]]] [۱] [۱]]]] [۱]
- ] مدیریت مغز: از یک درخت یا BSP استفاده کنید تا به سرعت مشخص شود که کدام اشیاء قابل مشاهده هستند.
- تعامل کاربر: صفحه کلید و ورودی ماوس را برای گردش در دوربین یا انتخاب اشیاء.
- انتزاع خط: طراحی یک سیستم سایه دار: تعریف و توابع قطعه به عنوان نقطه تابع، قادر به ارائه انعطاف پذیر بدون تزریق مجدد.
منابع و خواندن بیشتر
برای عمیق تر کردن درک خود، متون کلاسیک و آموزش های آنلاین که الهام بخش این موتور هستند را بررسی کنید:
- ] [FLT 1 ] [ [FLT: 1 ] توضیحات عمیق از ردیابی پرتو، حفاری و ریاضی.
- OpenGL - آموزش های مدرن OpenGL؛ با فصل "سلام مثلث" شروع کنید.
- وکیپزی: 3D Projection - ریاضی رسمی پشت چشم انداز و یا رشته های کتاب نگاری.
ساخت یک موتور 3D در C یک مراسم عبور برای برنامه نویسان گرافیک است.این به شما می آموزد که نه تنها چگونه کد کارآمد را بنویسید بلکه چگونه در سه بعد فکر کنید و سیستم های حیاتی عملکرد را با یک مکعب چرخ و خم کنید، سپس مثلث های بیشتر، بافت ها و در نهایت آن را به GPU اضافه کنید.سفر از C خام تا یک موتور کاملا کاربردی پشت هر صفحه نمایش جادویی را نشان دهد.