שתי דרכים לצייר עולם תלת־ממדי
מסך הוא רשת של פיקסלים, ותמונה של עולם תלת־ממדי היא פשוט צבע לכל אחד מהם. יש שתי דרכים לחשב את הצבעים האלה.
הראשונה היא רסטריזציה. כל עצם מתואר כרשת של משולשים. המחשב לוקח משולש אחרי משולש, מחשב היכן שלושת הקודקודים שלו נוחתים על המסך, וממלא את הפיקסלים שהמשולש מכסה. חוצץ עומק זוכר כמה רחוק המשטח הקרוב ביותר בכל פיקסל, כך שמשולש שנמצא מאחורי משולש אחר מצויר ואז מוסתר שוב. אחר כך כל פיקסל מכוסה עובר הצללה: תוכנית קטנה בכרטיס הגרפי מחשבת את צבעו לפי המשטח, הזווית שלו והאורות.
רסטריזציה מהירה. כרטיס גרפי יכול להעביר דרכה מיליארדי משולשים בשנייה, ולכן כמעט כל משחק, וכל סצנה באתר הזה, מצוירים כך: three.js מעביר את המשולשים ל־WebGL של הדפדפן, והכרטיס הגרפי מבצע להם רסטריזציה עד שישים פעמים בשנייה. הסטודיו שמסביב למצלמה בניסוי שלמעלה מצויר בדיוק כך.
הדרך השנייה היא מעקב קרניים. במקום לשאול אילו פיקסלים משולש מכסה, היא שואלת, לכל פיקסל, מה רואים דרכו. היא יורה קרן מהעין דרך הפיקסל ועוקבת אחריה לתוך הסצנה.
לעקוב אחרי האור לאחור
בעולם האמיתי האור יוצא ממנורה, ניתז מעצמים, וחלק זעיר ממנו מגיע לעין או למצלמה. לעקוב אחרי האור קדימה מהמנורה היה בזבוז חסר תקווה, כי כמעט כל האור נוחת במקומות שהמצלמה לא מסתכלת עליהם. אבל מסלול של אור עובד באותה צורה בשני הכיוונים, ולכן מעקב קרניים מריץ אותו לאחור: מהמצלמה, החוצה דרך כל פיקסל, עד שהוא מוצא מאין בא האור.
הגאומטריה ישנה. ב־1525 פרסם אלברכט דירר חיתוך עץ של אמנים שמציירים לאוטה: הם מותחים חוט מנקודה קבועה על הקיר, דרך מסגרת עץ, אל נקודה על הלאוטה, והמקום שבו החוט חוצה את המסגרת אומר להם היכן לסמן את הציור. המסגרת שלפני המצלמה בסצנה היא אותו רעיון, מישור התמונה, מחולק לפיקסלים. ב־1968 השתמש ארתור אפל במחשב כדי לשלוח קרניים כאלה ולהחליט איזה משטח כל פיקסל מראה והאם הוא בצל.
נסו: הזיזו את מעקב אחר הקרניים אל קרני מצלמה. קרניים תכלכלות יוצאות מעדשת המצלמה, עוברות דרך הפיקסלים המסומנים על המסגרת ונעצרות במשטח הראשון שכל אחת פוגשת: הכדור האדום, המראה, הרצפה או הקיר. הצבע של כל פיקסל נקבע לפי מה שקורה שם.
צללים והשתקפויות
למצוא את המשטח הראשון זה רק חצי מהעבודה. כדי לדעת כמה הנקודה הזאת מוארת, המעקב שואל האם היא רואה את מקור האור. הוא שולח קרן שנייה, קרן צל, מהנקודה אל האור. אם קרן הצל מגיעה, הנקודה מוארת, וחזק יותר כשהיא פונה אל האור ישירות וכשהאור קרוב. אם משהו חוסם את הדרך, הנקודה בצל.
גם מראה מטופלת בפשטות. כשקרן פוגעת במשטח ממורק היא ממשיכה בכיוון המוחזר, באותה זווית מהצד השני, והפיקסל מראה את מה שהקרן החדשה מוצאת. ב־1980 צירף טרנר ויטד את כל אלה למעקב קרניים רקורסיבי: קרניים מוחזרות ושבורות שולחות קרני צל והחזרות משלהן, והתמונות יצאו עם צללים חדים, כדורי מראה וזכוכית שמעקמת את מה שמאחוריה, דברים שרסטריזציה לא ידעה לעשות.
נסו: הזיזו את מעקב אחר הקרניים אל קרני צל. קרניים זהובות מגיעות אל פנל האור; קרן אדומה נעצרת במקום שבו משהו חוסם אותה, והנקודה שלה כהה. אחר כך קבעו את החזרות על 0: הקרניים כבר לא יכולות לשנות כיוון, ולכן כדור המראה יוצא שחור בתמונה, וכל צל שחור לגמרי.
השוו את כדור המראה בסטודיו לזה שבתמונה. הכדור של הסטודיו עובר רסטריזציה: הוא מחזיר תמונה שמורה של המנורות בסטודיו, עטופה סביבו כמו טפט, ולכן הוא אף פעם לא מראה את הכדור האדום שלידו. הכדור שבתמונה מראה את הכדור האדום ואת לוח השחמט מעוקמים על פניו, ואת פנל האור כריבוע בהיר, כי הקרניים שלו באמת הלכו והסתכלו. מערכות רסטריזציה מזייפות השתקפויות וצללים בתחבולות כמו התמונה השמורה הזאת ומפות צללים, תמונת עומק שמצולמת ממקור האור; מעקב קרניים מקבל אותם כשהוא עוקב אחרי האור.
אור שחוזר מכל עבר
אור אמיתי לא נעצר אחרי החזרה אחת. אור מהפנל פוגע ברצפה, וחלק ממנו מתפזר אל החלק התחתון של הכדור האדום; הכדור האדום זורק מעט אדום על הרצפה שלידו. צללים אף פעם לא שחורים לגמרי, כי אור מגיע מכל מקום שמואר.
ב־1986 כתב ג’יימס קג’יה את משוואת הרינדור, שאומרת שהאור שיוצא מכל נקודה הוא האור שהיא פולטת ועוד כל האור שמגיע אליה מכל הכיוונים ומתפזר מהמשטח. מעקב מסלולים מעריך אותה כשהוא עוקב אחרי כל קרן דרך הרבה החזרות. בכל משטח מאטי הוא שולח קרן צל אל האור, ואז בוחר כיוון אקראי אחד וממשיך, כשהצבע של הקרן מוכפל בצבע המשטח, כך שקרן שהוחזרה מהכדור האדום נושאת הלאה אור אדום.
נסו: הזיזו את מעקב אחר הקרניים אל החזרות וקבעו את החזרות על 1, 2 ואחר כך 4. המסלולים מתארכים, וכל החזרה צבועה בצבע שהקרן אספה. בתמונה, כדור המראה מראה את שכניו כבר מהחזרה אחת, והצללים מתבהרים ככל שעוד החזרות מביאות אור שמתפזר מהקיר ומהרצפה.
למה התמונה מתחילה מנומרת
הבחירות האקראיות הן המחיר. קרן עלולה לדגום נקודה על מקור האור שבמקרה מוסתרת, או להיתז אל קיר בהיר ולא אל הסטודיו החשוך, כך ששתי קרניים דרך אותו פיקסל יכולות להביא צבעים שונים מאוד. קרן אחת לפיקסל נותנת תמונה מנומרת: זה רעש. ממוצע של הרבה קרניים לפיקסל מקרב כל פיקסל לצבע האמיתי שלו, אבל לאט. הרעש שנשאר קטן כמו כש־ הוא מספר הקרניים, ולכן פי ארבעה קרניים רק מקטינים אותו בחצי, ולהקטין אותו בחצי שוב דורש פי שישה־עשר.
לא כל חלקי התמונה רועשים באותה מידה. מקור אור גדול יוצר צללים רכים, כי נקודה ליד שפת הצל רואה חלק ממקור האור ולא את כולו, וקומץ קרניים אקראיות מעריך את החלק הזה גרוע. מקור אור זעיר נותן צללים חדים שקרן אחת כבר מקבלת נכון; מה שנשאר הוא שוליים מדורגים של הצורות, כי קרן אחת דרך מרכז הפיקסל לא יכולה לדעת ששפה חוצה את הפיקסל. כמה קרניים שמפוזרות בתוך הפיקסל מחליקות גם את השוליים האלה, ולזה קוראים החלקת שוליים.
נסו: הורידו את קרניים לפיקסל עד 1, ואחר כך העלו את גודל מקור האור עד 2 m: הצללים רוחשים ברעש. הורידו את גודל מקור האור עד 0.1 m וקבעו את החזרות על 0, וקרן אחת כמעט מספיקה, חוץ מהשוליים המשוננים. עכשיו העלו את קרניים לפיקסל עד 256: המסך שעל המצלמה סופר עד 256 קרניים לפיקסל בזמן שהתמונה מתייצבת, והתרשים שליד הסצנה מראה כמה קרניים זה דרש וכמה זמן.
מעקב קרניים בסרטים, במשחקים ובאתר הזה
פריים של סרט קולנוע הוא כמה מיליוני פיקסלים, ולעתים קרובות מחשבים אותו במאות או אלפי קרניים לפיקסל ובהרבה החזרות, דרך סצנות של מאות מיליוני משולשים. לבדוק כל קרן מול כל משולש לא היה נגמר לעולם, ולכן תוכנות הרינדור ממיינות את המשולשים לעץ של קופסאות מקוננות, היררכיית נפחים תוחמים: קרן שמחטיאה קופסה מדלגת על כל מה שבתוכה. גם כך פריים יכול לקחת שעות. מאז אמצע שנות ה־2010 רוב סרטי האנימציה מחושבים במעקב מסלולים.
למשחקים יש רק 1/60 שנייה לכל פריים. ב־2018 קיבלו כרטיסים גרפיים מעגלים מיוחדים לבדיקת קרניים מול קופסאות ומשולשים, ומשחקים רבים משלבים היום את שתי השיטות: הם מבצעים רסטריזציה לתמונה, ואז עוקבים אחרי קרן או שתיים לפיקסל בשביל צללים, השתקפויות או אור מוחזר, ומנקים את הרעש במסנן רעש שמחליק אותו ושומר על השוליים.
האתר הזה נשאר עם רסטריזציה. הסצנות שלו חייבות לרוץ בטלפונים, עד שישים פעמים בשנייה, דרך WebGL, שלא נותן גישה למעגלים של מעקב קרניים. התמונה הקטנה בסצנה הזאת מחושבת במעבד של המחשב שלכם, ב־JavaScript רגיל, קרן אחרי קרן; הפיקסלים שהיא ממלאת הם אותה רשת של מספרי אדום, ירוק וכחול שמתוארת בתמונות דיגיטליות וצבע.
מה המודל הזה משאיר בחוץ
- חמש צורות ומקור אור אחד. תוכנות רינדור אמיתיות עוקבות אחרי מיליוני משולשים; המודל הזה מכיר שני כדורים, קופסה, הבמה, הקיר והרצפה סביבם, ולכן הוא לא צריך קופסאות תוחמות. אין בו זכוכית, ולכן אין שבירה, אף שבמעקב של ויטד היא הייתה. המצלמה, המסגרת שלה והכבלים של מקור האור אינם חלק מהסצנה שעוקבים אחריה, ולכן כדור המראה לא מראה אותם.
- משטחים מאטיים לגמרי או מראות מושלמות. רוב החומרים האמיתיים באמצע: צבע מבריק, מתכת מוברשת, עור שמכניס אור אל מתחת לפניו. כל אחד צריך כלל משלו לכיוון שבו הקרן ממשיכה.
- שלושה צבעים, לא ספקטרום. האור מחושב כאדום, ירוק וכחול, כמו שמסך מראה אותו, ולכן תופעות שתלויות באורך הגל, כמו הקשת של מנסרה, מחוץ להישג יד.
- כל פיקסל ממוצע באותה צורה. תוכנות מעקב מסלולים אמיתיות מכוונות את הקרניים האקראיות לכיוונים שמהם צפוי להגיע אור ועוצרות מסלול מוקדם כשהוא נושא מעט אור, וכך מקטינות את הרעש באותה עבודה. המודל הזה דוגם את מקור האור ישירות בכל החזרה ממשטח מאטי, אבל חוץ מזה בוחר באקראיות פשוטה, ולכן הרעש שלו כן, אבל גבוה יותר.
- הסטודיו הוא לא התמונה. הבמה שסביב המצלמה עוברת רסטריזציה, מוארת גם במנורות של הסטודיו ולא רק בפנל, והצללים שלה באים ממפת צללים; היא מראה את מה שבתמונה, לא איך התמונה נעשית.
