ViewWiki

העולם, קצת יותר מקרוב

גרפיקה תלת־ממדית ומעקב קרניים.

סרטים ומשחקים מציירים עולמות תלת־ממדיים כשהם מחשבים את הצבע של כל פיקסל. איך מעקב לאחור אחרי קרני אור ממצלמה יוצר תמונה?

גלו את הסצנה מאמר אינטראקטיבי

01 / הניסוי

פיקסל אחד. הרבה קרניים.

הורידו את מספר הקרניים לפיקסל עד שהתמונה מתמלאת ברעש, שנו את מספר ההחזרות ואת גודל מקור האור, ואז הציצו פנימה כדי לעקוב אחרי הקרניים.

תמונה של הסצנה התלת־ממדית „גרפיקה תלת־ממדית ומעקב קרניים”, שעוסקת בשאלה: איך מחשב הופך סצנה תלת־ממדית לתמונה כשהוא עוקב אחרי קרני אור?
סצנה אינטראקטיבית

הגרסה האינטראקטיבית נטענת…

ההסבר שלמטה זמין כבר עכשיו, בזמן שהסצנה נטענת.

התמונה על המסגרת שלפני המצלמה מחושבת במעקב קרניים בזמן אמת, בדפדפן שלכם, על המעבד של המחשב שלכם. כל פיקסל הוא ממוצע של הקרניים שלו, ולכן אותן הגדרות נותנות תמיד אותה תמונה. כל מה שסביבה מצויר בדרך הרגילה, ב־three.js שמבצע רסטריזציה של משולשים בכרטיס הגרפי.המעקב מכיר רק חמש צורות, משטחים מאטיים לגמרי או מראות מושלמות, ומקור אור שטוח וריבועי אחד, והוא עובד באדום, ירוק וכחול במקום בספקטרום המלא. התמונה קטנה בכוונה, 96 על 60 פיקסלים (64 על 40 בטלפון), כדי שאפשר יהיה לחשב את הקרניים ברגע. הסטודיו מואר גם במנורות שלו ולא רק בפנל, ולכן ההצללה שלו דומה לזו שבתמונה רק בקירוב.

02 / שלוש דרכים לצייר

אותו כדור. שלוש שאלות.

כל תרשים מראה כדור על רצפה מהצד: העין משמאל, מישור התמונה לפניה מחולק לפיקסלים, ומקור האור למעלה מימין.

משולש אחרי משולש01
עיןפיקסלים מלאים

רסטריזציה

כל משולש מוטל על המסך, והפיקסלים שהוא מכסה מתמלאים ומוצללים. חוצץ עומק שומר בכל פיקסל את המשטח הקרוב ביותר.

נקודת מוצא
משולש ← הפיקסלים שהוא מכסה
צללים
מפות צללים: תמונת עומק שמצולמת ממקור האור
השתקפויות
תמונה שמורה של הסביבה
מחיר
מיליוני משולשים 60 פעמים בשנייה, גם בטלפון
שימושים
משחקים, וכל סצנה באתר הזה
פיקסל אחרי פיקסל02
עיןמוארבצל

מעקב קרניים

קרן מהעין דרך כל פיקסל מוצאת את המשטח הראשון. קרן צל שואלת אם הנקודה רואה את האור; מראה שולחת את הקרן הלאה.

נקודת מוצא
פיקסל ← המשטח הראשון שהקרן שלו פוגשת
צללים
קרן צל אחת לכל נקודה: שוליים חדים
השתקפויות
מראות וזכוכית מדויקות
מחיר
כמה קרניים לפיקסל; בזמן אמת עם חומרה למעקב קרניים
שימושים
אנימציה ממוחשבת מוקדמת; צללים והשתקפויות במשחקים היום
הרבה מסלולים אקראיים03
עיןמואר מהרצפה

מעקב מסלולים

כל קרן ממשיכה בכיוון אקראי, כך שאור מגיע למקומות מוצלים דרך משטחים אחרים. הרבה קרניים לפיקסל מבטלות את הרעש בממוצע.

נקודת מוצא
פיקסל ← הרבה מסלולי אור אקראיים
צללים
רכים, ומוארים באור מוחזר
השתקפויות
הכול, כולל צבע שעובר בין משטחים
מחיר
מאות קרניים לפיקסל; מנומר עד שיש מספיק
שימושים
סרטים, תמונות מוצר, והתמונה בסצנה הזאת
הרעיון הגדול

רסטריזציה שואלת, לכל משולש, אילו פיקסלים הוא מכסה? מעקב קרניים שואל, לכל פיקסל, מה הקרן שלו פוגשת? על השאלה השנייה לוקח יותר זמן לענות, אבל אז האור מתנהג כמו אור: צללים, השתקפויות ואור שעובר בין משטחים נובעים כולם מהמעקב אחרי הקרניים.

שתי דרכים לצייר עולם תלת־ממדי

מסך הוא רשת של פיקסלים, ותמונה של עולם תלת־ממדי היא פשוט צבע לכל אחד מהם. יש שתי דרכים לחשב את הצבעים האלה.

הראשונה היא רסטריזציה. כל עצם מתואר כרשת של משולשים. המחשב לוקח משולש אחרי משולש, מחשב היכן שלושת הקודקודים שלו נוחתים על המסך, וממלא את הפיקסלים שהמשולש מכסה. חוצץ עומק זוכר כמה רחוק המשטח הקרוב ביותר בכל פיקסל, כך שמשולש שנמצא מאחורי משולש אחר מצויר ואז מוסתר שוב. אחר כך כל פיקסל מכוסה עובר הצללה: תוכנית קטנה בכרטיס הגרפי מחשבת את צבעו לפי המשטח, הזווית שלו והאורות.

רסטריזציה מהירה. כרטיס גרפי יכול להעביר דרכה מיליארדי משולשים בשנייה, ולכן כמעט כל משחק, וכל סצנה באתר הזה, מצוירים כך: three.js מעביר את המשולשים ל־WebGL של הדפדפן, והכרטיס הגרפי מבצע להם רסטריזציה עד שישים פעמים בשנייה. הסטודיו שמסביב למצלמה בניסוי שלמעלה מצויר בדיוק כך.

הדרך השנייה היא מעקב קרניים. במקום לשאול אילו פיקסלים משולש מכסה, היא שואלת, לכל פיקסל, מה רואים דרכו. היא יורה קרן מהעין דרך הפיקסל ועוקבת אחריה לתוך הסצנה.

לעקוב אחרי האור לאחור

בעולם האמיתי האור יוצא ממנורה, ניתז מעצמים, וחלק זעיר ממנו מגיע לעין או למצלמה. לעקוב אחרי האור קדימה מהמנורה היה בזבוז חסר תקווה, כי כמעט כל האור נוחת במקומות שהמצלמה לא מסתכלת עליהם. אבל מסלול של אור עובד באותה צורה בשני הכיוונים, ולכן מעקב קרניים מריץ אותו לאחור: מהמצלמה, החוצה דרך כל פיקסל, עד שהוא מוצא מאין בא האור.

הגאומטריה ישנה. ב־1525 פרסם אלברכט דירר חיתוך עץ של אמנים שמציירים לאוטה: הם מותחים חוט מנקודה קבועה על הקיר, דרך מסגרת עץ, אל נקודה על הלאוטה, והמקום שבו החוט חוצה את המסגרת אומר להם היכן לסמן את הציור. המסגרת שלפני המצלמה בסצנה היא אותו רעיון, מישור התמונה, מחולק לפיקסלים. ב־1968 השתמש ארתור אפל במחשב כדי לשלוח קרניים כאלה ולהחליט איזה משטח כל פיקסל מראה והאם הוא בצל.

נסו: הזיזו את מעקב אחר הקרניים אל קרני מצלמה. קרניים תכלכלות יוצאות מעדשת המצלמה, עוברות דרך הפיקסלים המסומנים על המסגרת ונעצרות במשטח הראשון שכל אחת פוגשת: הכדור האדום, המראה, הרצפה או הקיר. הצבע של כל פיקסל נקבע לפי מה שקורה שם.

חזרה לניסוי

צללים והשתקפויות

למצוא את המשטח הראשון זה רק חצי מהעבודה. כדי לדעת כמה הנקודה הזאת מוארת, המעקב שואל האם היא רואה את מקור האור. הוא שולח קרן שנייה, קרן צל, מהנקודה אל האור. אם קרן הצל מגיעה, הנקודה מוארת, וחזק יותר כשהיא פונה אל האור ישירות וכשהאור קרוב. אם משהו חוסם את הדרך, הנקודה בצל.

גם מראה מטופלת בפשטות. כשקרן פוגעת במשטח ממורק היא ממשיכה בכיוון המוחזר, באותה זווית מהצד השני, והפיקסל מראה את מה שהקרן החדשה מוצאת. ב־1980 צירף טרנר ויטד את כל אלה למעקב קרניים רקורסיבי: קרניים מוחזרות ושבורות שולחות קרני צל והחזרות משלהן, והתמונות יצאו עם צללים חדים, כדורי מראה וזכוכית שמעקמת את מה שמאחוריה, דברים שרסטריזציה לא ידעה לעשות.

נסו: הזיזו את מעקב אחר הקרניים אל קרני צל. קרניים זהובות מגיעות אל פנל האור; קרן אדומה נעצרת במקום שבו משהו חוסם אותה, והנקודה שלה כהה. אחר כך קבעו את החזרות על 0: הקרניים כבר לא יכולות לשנות כיוון, ולכן כדור המראה יוצא שחור בתמונה, וכל צל שחור לגמרי.

חזרה לניסוי

השוו את כדור המראה בסטודיו לזה שבתמונה. הכדור של הסטודיו עובר רסטריזציה: הוא מחזיר תמונה שמורה של המנורות בסטודיו, עטופה סביבו כמו טפט, ולכן הוא אף פעם לא מראה את הכדור האדום שלידו. הכדור שבתמונה מראה את הכדור האדום ואת לוח השחמט מעוקמים על פניו, ואת פנל האור כריבוע בהיר, כי הקרניים שלו באמת הלכו והסתכלו. מערכות רסטריזציה מזייפות השתקפויות וצללים בתחבולות כמו התמונה השמורה הזאת ומפות צללים, תמונת עומק שמצולמת ממקור האור; מעקב קרניים מקבל אותם כשהוא עוקב אחרי האור.

אור שחוזר מכל עבר

אור אמיתי לא נעצר אחרי החזרה אחת. אור מהפנל פוגע ברצפה, וחלק ממנו מתפזר אל החלק התחתון של הכדור האדום; הכדור האדום זורק מעט אדום על הרצפה שלידו. צללים אף פעם לא שחורים לגמרי, כי אור מגיע מכל מקום שמואר.

ב־1986 כתב ג’יימס קג’יה את משוואת הרינדור, שאומרת שהאור שיוצא מכל נקודה הוא האור שהיא פולטת ועוד כל האור שמגיע אליה מכל הכיוונים ומתפזר מהמשטח. מעקב מסלולים מעריך אותה כשהוא עוקב אחרי כל קרן דרך הרבה החזרות. בכל משטח מאטי הוא שולח קרן צל אל האור, ואז בוחר כיוון אקראי אחד וממשיך, כשהצבע של הקרן מוכפל בצבע המשטח, כך שקרן שהוחזרה מהכדור האדום נושאת הלאה אור אדום.

נסו: הזיזו את מעקב אחר הקרניים אל החזרות וקבעו את החזרות על 1, 2 ואחר כך 4. המסלולים מתארכים, וכל החזרה צבועה בצבע שהקרן אספה. בתמונה, כדור המראה מראה את שכניו כבר מהחזרה אחת, והצללים מתבהרים ככל שעוד החזרות מביאות אור שמתפזר מהקיר ומהרצפה.

חזרה לניסוי

למה התמונה מתחילה מנומרת

הבחירות האקראיות הן המחיר. קרן עלולה לדגום נקודה על מקור האור שבמקרה מוסתרת, או להיתז אל קיר בהיר ולא אל הסטודיו החשוך, כך ששתי קרניים דרך אותו פיקסל יכולות להביא צבעים שונים מאוד. קרן אחת לפיקסל נותנת תמונה מנומרת: זה רעש. ממוצע של הרבה קרניים לפיקסל מקרב כל פיקסל לצבע האמיתי שלו, אבל לאט. הרעש שנשאר קטן כמו 1/N1/\sqrt{N}⁠ כש־NN⁠ הוא מספר הקרניים, ולכן פי ארבעה קרניים רק מקטינים אותו בחצי, ולהקטין אותו בחצי שוב דורש פי שישה־עשר.

לא כל חלקי התמונה רועשים באותה מידה. מקור אור גדול יוצר צללים רכים, כי נקודה ליד שפת הצל רואה חלק ממקור האור ולא את כולו, וקומץ קרניים אקראיות מעריך את החלק הזה גרוע. מקור אור זעיר נותן צללים חדים שקרן אחת כבר מקבלת נכון; מה שנשאר הוא שוליים מדורגים של הצורות, כי קרן אחת דרך מרכז הפיקסל לא יכולה לדעת ששפה חוצה את הפיקסל. כמה קרניים שמפוזרות בתוך הפיקסל מחליקות גם את השוליים האלה, ולזה קוראים החלקת שוליים.

נסו: הורידו את קרניים לפיקסל עד 1, ואחר כך העלו את גודל מקור האור עד 2 m: הצללים רוחשים ברעש. הורידו את גודל מקור האור עד 0.1 m וקבעו את החזרות על 0, וקרן אחת כמעט מספיקה, חוץ מהשוליים המשוננים. עכשיו העלו את קרניים לפיקסל עד 256: המסך שעל המצלמה סופר עד 256 קרניים לפיקסל בזמן שהתמונה מתייצבת, והתרשים שליד הסצנה מראה כמה קרניים זה דרש וכמה זמן.

חזרה לניסוי

מעקב קרניים בסרטים, במשחקים ובאתר הזה

פריים של סרט קולנוע הוא כמה מיליוני פיקסלים, ולעתים קרובות מחשבים אותו במאות או אלפי קרניים לפיקסל ובהרבה החזרות, דרך סצנות של מאות מיליוני משולשים. לבדוק כל קרן מול כל משולש לא היה נגמר לעולם, ולכן תוכנות הרינדור ממיינות את המשולשים לעץ של קופסאות מקוננות, היררכיית נפחים תוחמים: קרן שמחטיאה קופסה מדלגת על כל מה שבתוכה. גם כך פריים יכול לקחת שעות. מאז אמצע שנות ה־2010 רוב סרטי האנימציה מחושבים במעקב מסלולים.

למשחקים יש רק 1/60 שנייה לכל פריים. ב־2018 קיבלו כרטיסים גרפיים מעגלים מיוחדים לבדיקת קרניים מול קופסאות ומשולשים, ומשחקים רבים משלבים היום את שתי השיטות: הם מבצעים רסטריזציה לתמונה, ואז עוקבים אחרי קרן או שתיים לפיקסל בשביל צללים, השתקפויות או אור מוחזר, ומנקים את הרעש במסנן רעש שמחליק אותו ושומר על השוליים.

האתר הזה נשאר עם רסטריזציה. הסצנות שלו חייבות לרוץ בטלפונים, עד שישים פעמים בשנייה, דרך WebGL, שלא נותן גישה למעגלים של מעקב קרניים. התמונה הקטנה בסצנה הזאת מחושבת במעבד של המחשב שלכם, ב־JavaScript רגיל, קרן אחרי קרן; הפיקסלים שהיא ממלאת הם אותה רשת של מספרי אדום, ירוק וכחול שמתוארת בתמונות דיגיטליות וצבע.

מה המודל הזה משאיר בחוץ

  • חמש צורות ומקור אור אחד. תוכנות רינדור אמיתיות עוקבות אחרי מיליוני משולשים; המודל הזה מכיר שני כדורים, קופסה, הבמה, הקיר והרצפה סביבם, ולכן הוא לא צריך קופסאות תוחמות. אין בו זכוכית, ולכן אין שבירה, אף שבמעקב של ויטד היא הייתה. המצלמה, המסגרת שלה והכבלים של מקור האור אינם חלק מהסצנה שעוקבים אחריה, ולכן כדור המראה לא מראה אותם.
  • משטחים מאטיים לגמרי או מראות מושלמות. רוב החומרים האמיתיים באמצע: צבע מבריק, מתכת מוברשת, עור שמכניס אור אל מתחת לפניו. כל אחד צריך כלל משלו לכיוון שבו הקרן ממשיכה.
  • שלושה צבעים, לא ספקטרום. האור מחושב כאדום, ירוק וכחול, כמו שמסך מראה אותו, ולכן תופעות שתלויות באורך הגל, כמו הקשת של מנסרה, מחוץ להישג יד.
  • כל פיקסל ממוצע באותה צורה. תוכנות מעקב מסלולים אמיתיות מכוונות את הקרניים האקראיות לכיוונים שמהם צפוי להגיע אור ועוצרות מסלול מוקדם כשהוא נושא מעט אור, וכך מקטינות את הרעש באותה עבודה. המודל הזה דוגם את מקור האור ישירות בכל החזרה ממשטח מאטי, אבל חוץ מזה בוחר באקראיות פשוטה, ולכן הרעש שלו כן, אבל גבוה יותר.
  • הסטודיו הוא לא התמונה. הבמה שסביב המצלמה עוברת רסטריזציה, מוארת גם במנורות של הסטודיו ולא רק בפנל, והצללים שלה באים ממפת צללים; היא מראה את מה שבתמונה, לא איך התמונה נעשית.

מותר לעשות בהם שימוש חוזר, עם קרדיט ל־ViewWiki וקישור לעמוד הזה.

04 / ללמוד את זה בקורס

תרגול, צעד אחר צעד.

השיעור הזה מלמד את הנושא עם שאלות שנבדקות.

  1. מעקב קרניים מדעי המחשב · מחשוב בעולם האמיתי