תוכנה & הנדסה ממוחשבת
שימוש ב-C כדי לפתח מנוע גרפי בסיסי 3d
Table of Contents
ארכיון תגיות: Representing Three-Dimensional Space
לפני שסול יחיד נמשך, מנוע 3D חייב להיות שפה מתמטית כדי לתאר אובייקטים בחלל.במרכז הליבה הם FLT:0vectorsFLT:1 (שלושת קודים המייצגים עמדה, כיוון או צבע) ו-FLT:2matricesFLT 3: (4×4 מערכי קודים).
- (ב) לנקודות ולובולוגים.
- (ב) ב[[1924]], [[1924]]]], [[1924]]]]
כל חפץ מורכב מ-FLT:0 ,30sanglesFIRLT:1 [משולש] מוגדר על ידי שלושה אותנטיות, כל אחד עם עמדה, ואופציונלית צבע רגיל וצבע.מחיש אותם כערכים מרשימים (למשל, FLT:2 עבור קוביה) משפר יעילות מטמון - קריטי כאשר אתה מיישם אלפי פרצופים מאוחר יותר.
The GraphicsPiline: From Vertices to Pixels
צינור גרפיקה הוא רצף של שלבים שהופכים נתונים של סצנת 3D לתוך תמונה 2D. במנוע מבוסס תוכנה בסיסית, אתה ליישם באופן ידני כל שלב.השלבים העיקריים הם:
- (ב) ,0) ,VertexeurFLT:1 - יישום מודל, תצוגה והקרנה משתנים.
- (ב) ,0) ,[[1924]]]], [[1924]]]]]]
- (ב) ויקרא י"ד: "ה' אלקים" (בראשית כ"ד) - "מחשוב את צבע כל שבר שמבוסס על תאורה וחומר".
- (ב) ,0Output MergingFLT:1 - שילוב שברים עם buffer המסגרת, כולל בדיקות עומק.
מנועי קשיחים (באמצעות OpenGL, Vulkan, או DirectX) מבצעים את רוב השלבים האלה על GPU, אבל הבנת נתיב התוכנה נותנת לך תובנה עמוקה על איך ה- GPU עובד מתחת למכסה.
עיבוד וטרנספורמציות Vertex
(ב) כל מדרש (ב) הוא [[המאה ה-1]], [[המאה ה-20]], [[1924]], [[1924]]]], [[1924]]]], [[1924]]]]]], [[1924]]]]]]]], [[1924]]]]]]]]]], [[1924]]]]]]]]]], [[1924]]]]]]]]]]]]]], [[1924]]]]]]]]]]]]]]]], [[1924]]]]]], [[1924]]]]]]]]]]]]]]]], [[1924]]]]]]]]]]]]]]]]]]]], [[1924]], [[1924]]]]]], [[1924]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]], [[1924]]]]]]]], [[1966]], [[1924]]]], [[1966]], [[1924]], [[1966]], [[1924]]]]]]]]]], [[1924]], [[1924]]]]]]]], [[1924]]]]]]]]]], [[1966]]]]]]]]]], [[[[1924]]]]
ב- C, פונקציות טרנספורמציה נראות כמו:
- (ב) ,(FLT 3: 3) מחזירה מטריקס זהות.
- (ב) ,4.
- (ב) 5) סיבוב סביב ציר ה-X.
- (FLT:6) - מכפיל 4×4 ממטריקס על ידי וקטור 4 של יישום (הומוגוגני).
הגוון של ה-vertex שווה ערך בתוכנות, מתכפל כל אחד על ידי המשולב 7 ממטריקס, ומאחסן את התוצאה של buffer מהפך.
המונחים: Perspective vsus Orthographic
הקרנה שולטת כמה עומק מיוצג על המסך.FLT:0 הקרנה מקדימה 1FLT 1 הופכת אובייקטים מרוחקים להופיע קטנים יותר, יצירת ריאליזם.המטריקס שלה בנוי מהשדה של הראייה, יחס היבט, ליד ומרחק מטוסים.הנוסחה הקלאסית כוללת חלוקת רכיבי x ו- y על ידי z (לאחר המטריקס).
- (ב) ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇
(FLT:0 אורתוגרפיה הקרנה 1FLT) משמר קווים מקבילים וקל יותר, המשמש כלי UI או CAD.זה לא כרוך בחלוקת נקודות מבט.
« « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « « «
לאחר הקרנה, יש לך קואורדינטות מסך 2D (כמו עמדות פיקסל) וערך עומק (z) Rasterization שובר כל משולש לשבריריות המכסות את קואורדינטות pixel.
- מיין את שלושת האתוליים של משולש על ידי y-coתואמים.
- הורידו את הקצוות הימניים והשמאליים, ממקדים גבולות x לכל סריקה.
- עבור כל פיקסל בטווח האופקי, לחשב את עומק השבר על ידי בין בין המשולש.
- עשה את זה (FLT:0) מבחן מעמיק (FLT: 1:1): להשוות את ה- z של השבר עם הערך כבר ב- buffer העומק.
יישום אלגוריתם הליכה קצה ביעילות C דורש לולאות הדוקות ושימוש זהיר של סטויינט קבוע כדי למנוע צף נקודה מעל הראש. מנועי תחביב רבים מתחילים עם גישה כוח רוטט (בדיקה כל פיקסל בתיבה המסוימת) ולאחר מכן אופטימיזציה עם משוואות קצה.
שינג ואור
מנוע שטוח פשוט משתמש בצבע יחיד למשולש, המקוטב מן הפנים רגיל ומקור אור יחיד.ה-FLT:0Lambertian ModelsFLT:1 נותן עוצמת דיפרזה: (FLT:9 ב C, אתה מצמיד את הרגיל כמו המוצר הצלב של שני הקצוות משולשים (לאחר הפיכת אותנטיות לחלל), ולאחר מכן להכפיל את האור על ידי משולש הצבעים.
כדי להוסיף עומק, ליישם את ה-FLT:0 (Gouraud Shadingph1) (נורמטיקה, מפולגת על פני חלקים) או FLT:2Phong dingigatingph3 (מספר פיקסלים) האחרון דורש שילוב של עמדות עולם ונורמליות, ולאחר מכן מחשוב לשבריר - תוצאות יקרות יותר אך טובות יותר.
בניית המנוע ב-C: צעדים מעשיים
בואו נלך דרך בניית מנוע תוכנה 3D מינימלי מאפס.המטרה היא להפוך קוביה מסתובבת עם תאורה מתפתלת ותמציתית על חלון 640×480 פיקסל.
שלב ראשון – הגדר פיקסל Buffer
⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇
שלב 2 – Define Scene Data
עבור קוביה, שישה פרצופים (12 משולשים) דורשים 12×3=36 ריאליות. לאחסן אותם במערך של מבנים עם מיקום (3 צפים) וצבע (3 צפים עבור RGB). קדם-define 8 פינות קוביות ייחודיות ושישה צבעים פנים. השתמש באינדקס bu כדי להימנע משכפול של מוטציות.
שלב 3 - טרנספורמציה פילין
כל מסגרת, סמן את מודל מאטריקס מזווית (למשל, לסובבים (זמן)), את התצוגה מאטריקס ממצלמה קבועה המתבוננת במקור, ואת ממטריקס ההקרנה של ה- 15.שלב אותם לתוך מאטריקס יחיד: (FLT:12 כל שינוי) על ידי הכפלה עם FLT:13 ואז לבצע פרספקטיבה (divide xyz על ידי wyz על ידי w) כדי לתאם בדיקות zDC רגיל (N-1, 000).
שלב 4 - Rasterize ו-Shade
עבור כל משולש, השתמש בשיטת הסריקה.בעוד פיקסלים הליכה, בין עומק וגם בין תכונה per-vertex כמו מיקום העולם-מרחב (עבור Phong) או את ה- vertex רגיל (עבור Gouraud) החל את משוואה diffuse Lambertian. לכתוב את הצבע הסופי ל-Fubbuffer אם מבחן העומק עובר.
שלב 5 - תצוגה
(ב) (בקיצור: ⁇ ) או ספריה דומה ליצירת חלון ו-Blit the Framebuffer (לדוגמה, עם SDL2:FLT:16,FLT:17, 17, 18 ב-FLT:18 ב-FLT:19, ולאחר מכן FLT:20 ו-FLT:21 כל מסגרת.
נתיב תוכנה זה פועל על CPU, כך הביצועים מוגבלים לאלף משולשים למסגרת.רגע נוח, אתה יכול להחליף את שכבת הרסטריזציה עם OpenGL, לטעום את העבודה הכבדה ל- GPU תוך שמירה על הטרנספורמציה שלך ואת לוגיקה הסצנה ב- C.
אופטימיזציה של המנוע שלך
מנוע בסיסי איטי, מספר אופטימיזציה הם חיוניים לביצועים בזמן אמת:
- (ב) ⁇ :0) ,בחזרה-פנים: (FLT:1) משולשי דלגו אשר רגיל שלהם רחוק מהמצלמה.למלא את השטח החתום של משולש המצופה (ב 2D) או לבדוק את מוצר הבלוט של הפנים נורמלי עם הכיוון של הנוף.
- (ב) עיין בתיבת החפץ (ב"ד:ב) ב[[1924]], ב[[1924]], ב[[1924]], [[1924]], [[1924]], [[1924]], [[1924]]]], [[1924]]]], [[1924]]]]]], [[1924]]
- (FLT:0)Fixed-point ⁇ :FLT:1) להחליף פעולות צף עם מתמטיקה integer בלולאות רסטריזציה הדוקות.מבנים מנועים רבים משתמשים 16.16 נקודות קבועות עבור אינטרפולציה קורקינט.
- (ב) ⁇ :0) , ⁇ : ⁇ : ⁇ : ⁇ : ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇
- (FLT:0)blocked מסגרת buffer כותב: "הרש"ל:1" , כתוב פיקסלים בסדר זיכרון (משמאל-to-right, Top-to- ⁇ ) כדי למקסם את להיטי ה-Cache.
טכניקות אלה יכולות לדחוף מהפך תוכנה מ 3-5 fps עד 60 fps לסצנות של מורכבות בינונית (למשל, כמה מאות משולשים).
עקבו אחרי The Engine
לאחר שבסיס מוצק קיים, תוכל להוסיף תכונות באופן מצטבר:
- (FLT:0) מיפוי מיפוי: 1FLT:1 לאחסן תמונות 2D ו לתאם בין-סגול UV בין משולשים. יישום מסנן דו-לינארי לתוצאות חלקות.
- (ב) ,0) , ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇
- (ב) (ב) ,0) ניהול קיסרי: 1 (ב) השתמש עץ octree או BSP כדי לקבוע במהירות אילו אובייקטים גלויים.
- (ב) ,0 משתמשים (בשיתוף: ⁇ FLT:1 ), מקלדת וקלט עכברים כדי להזיז את המצלמה או לבחור חפצים.
- (FLT:0) אבסטרקציה של פילין: 1FLT) עיצוב מערכת צל: להגדיר vertex ופונקציות שבר כמצביעים פונקציה, המאפשרת ציות גמישות ללא שכפול.
משאבים וקריאה נוספת
כדי להעמיק את ההבנה שלך, לחקור את הטקסטים הקלאסיים ואת הדרכות מקוונות בהשראת המנוע הזה:
- (ב) ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇
- (ב) ,0) למד פתח (OpenGLigmFLT:1) - מודרני פותחים את המדריכים, להתחיל עם פרק "המשולש הלוה" (שלום משולש).
- (ב) [15] ויקיפדיה: 3D Projectionioph:1 ; המתמטיקה הרשמית מאחורי פרספקטיבה ומטבים אורתוגרפיים.
בניית מנוע 3D ב C היא טקס המעבר עבור מתכנתים גרפיים.זה מלמד אותך לא רק איך לכתוב קוד יעיל, אלא גם איך לחשוב בשלושה ממדים ולהלחין מערכות קריטיות ביצועים.התחל עם קוביה אחת רוטטת, ולאחר מכן להוסיף יותר משולשים, מרקמים, ולבסוף להעביר אותו אל GPU.המסע מ C למנוע פונקציונלי לחלוטין מגלה את הקסם מאחורי כל פיקסל על המסך.