תאורה למשחקים לניידים באמצעות Unity

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

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

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

אפשרויות של צינור עיבוד הנתונים

צינור העיבוד (Render Pipeline) מדור קודם של Unity כולל את נתיבי העיבוד הבאים:

  • עיבוד קדימה
  • הצללה מושהית

עיבוד קדימה

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

הצללה מושהית

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

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

Universal Render Pipeline

חברת Unity פיתחה את Universal Render Pipeline (URP). מומלץ מאוד להשתמש ב-URP במשחקים לנייד.

מצבי תאורה

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

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

מידע נוסף זמין במאמר בנושא צינור העברת הנתונים של התאורה ב-Unity.

כשאפשר, כדאי להשתמש באור סטטי ולהימנע מאור דינמי

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

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

Lightmap baking

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

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

איור 1. הגדרת התאורה המוכנה לשימוש שבה נעשה שימוש בהדגמה הטכנולוגית של Armies.

כדי להטמיע את האורות, פועלים לפי שלושת השלבים הבאים.

שלב 1: מגדירים את התאורה ל-Mixed או ל-Baked

מגדירים את המצב של התאורה ל'מעורב' או ל'אפוי'. בכותרות למובייל, עדיף להשתמש בתאורה מוטמעת (Baked) ולא בתאורה מעורבת (Mixed). האפייה היא הדרך הכי זולה לעיבוד של אור.

איור 2. ההגדרה Mode של התאורה ב-Unity.

שלב 2. הגדרת אובייקטים כסטטיים

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

איור 3. דוגמה לתפריט סטטי.

שלב 3. אפיית האורות

אפשר להטמיע את האורות באמצעות התפריט Lighting שנמצא בWindow > Rendering > Lighting Settings.

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

איור 4. דוגמה למפות תאורה מוטמעות.

אופטימיזציה של מפות תאורה

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

בדוגמה הבאה מתוך ההדגמה של Armies, יש שבע מפות תאורה בגודל 1024x1024 פיקסלים. בתצוגה המקדימה של המפה, אפשר לראות רשתות שמונחות על מפת התאורה. הרשתות שנבחרו יודגשו.

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

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

Lightmappers

ב-Unity יש שלוש שיטות להוספת אפייה של האורות בסצנה:

  • Enlighten: נתמך רק עד לגרסת התמיכה לטווח ארוך (LTS) משנת 2020. לא מומלץ להשתמש בשיטה הזו לפרויקטים חדשים.
  • מעבד (CPU) פרוגרסיבי: חוסך הרבה זמן כי הוא יוצר מפות אור בהדרגה. אם האפשרות הצגת תצוגה מקדימה בעדיפות גבוהה מסומנת, האזורים בתצוגת הסצנה מקבלים עדיפות. כך אפשר לקצר את זמן האיטרציה להגדרת התאורה בסצנה.
  • Progressive GPU: האפשרות הזו פועלת כמו Progressive CPU, אבל יוצרת את מפת האור ב-GPU במקום במעבד. במקרים של חומרה נתמכת, השיטה הזו יכולה לקצר משמעותית את זמן ה-baking בהשוואה לשימוש במעבד (CPU). יש דרישות נוספות להגדרת GPU פרוגרסיבי. מידע נוסף על הדרישות זמין בדף The Progressive GPU Lightmapper.

איור 6. Lightmapper Settings מאפשרות לשנות את שיטת ה-bake של הסצנה.

Texels

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

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

איור 7. ההגדרות הזמינות למפות תאורה.

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

איור 8. לקובייה הראשונה יש Lightmap Resolution של 1. לתיבה השנייה יש רזולוציית מפת תאורה של 2. לתיבה השלישית יש Lightmap Resolution של 5.

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

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

בדוגמה הבאה, הפחתה של Lightmap Resolution מ-15 ל-12 בהדגמה של Armies מפחיתה את מספר מפות האור שנדרשות משבע לארבע.

איור 9. הדגמה של Armies עם רזולוציית מפת תאורה של 12.

שימוש בטקסלים

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

ב-Unity אפשר לקבוע כמה טקסלים כל אובייקט ינצל. ב-Inspector > Mesh Renderer של אובייקט, ערך הפרמטר Scale In Lightmap קובע את מספר הטקסלים שהאובייקט משתמש בהם במפת התאורה.

בדוגמה הבאה, לקובייה שמימין יש חמישה טקסלים של מידע על תאורה לכל יחידת אפייה. התיבה בצד ימין מוגדרת עם Scale In Lightmap (שינוי קנה מידה במפת תאורה) של 0.5. ההגדרה הזו משנה את קנה המידה של הטקסלים של האור ל-2.5, ולכן נדרש פחות מקום במפת האור מאשר בתיבה שמימין.

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

איור 11. אפשר לשנות את ההגדרה Scale In Lightmap כדי שאובייקט יכיל פחות טקסלים.

מומלץ להימנע מהוצאת טקסלים על הפעולות הבאות:

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

כדאי להשתמש בתאורה מלאכותית ככל האפשר

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

צללים מזויפים

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

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

  • משתמשים ברשת תלת-ממדית, כמו מישור או מרובע, שמוצבת מתחת לדמות, ומחילים עליה מרקם מטושטש.
  • אתם יכולים לכתוב shader מותאם אישית כדי ליצור צללים מורכבים יותר של כתמים.

בדוגמה הבאה מוצגת התוצאה אם משתמשים ברשת תלת-ממדית ליצירת צל:

איור 12. הטמעת צללים בהדגמה הטכנית של Armies.

הוספת מידע על תאורה ישירות לטקסטורות

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

מוטות גישוש למפולות שלג

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

אפשר לפתור את הבעיה הזו באמצעות Light Probes. ל-Light Probes יש יתרונות דומים ל-lightmaps. הם מאחסנים נתונים קלים לחישוב שאפשר לחשב מראש ולשמור לשימוש בזמן הריצה. כך רוב העלויות של החישובים עוברות לזמן העריכה.

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

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

במאמרים הבאים אפשר לקרוא מידע נוסף על תאורה סטטית עם חיישני אור ועל חיישני אור.

איור 13. חיישני אור שמוצבים כדי להאיר את הקהל הדינמי בהדגמה הטכנולוגית של Armies.

הגדרות Mesh Renderer

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

משביתים את כל מה שלא משתמשים בו. הגדרות כמו הטלת צללים מוסיפות לעלות כשמבצעים רינדור של הסצנה, גם אם האובייקט לא מואר. הדוגמה הבאה להגדרות של Mesh Renderer היא של דמות שמוצגת באיור 13. הדמות משתמשת בנתוני בדיקה של מקור אור, אבל לא בבדיקות של השתקפויות.

ההגדרה Blend Probes של Light Probes ממזגת את נתוני התאורה מ-Light Probes הקרובים ביותר לדמות. כשהדמות זזה בסצנה, משתנים גם המיקומים של חיישני האור שמשפיעים עליה. האפשרות הטלת צללים מושבתת כי הרינדור משתמש בשיטת ה-blob. גם האפשרות Receive Shadows (קבלת צללים) מושבתת כי הסצנה נאפתה ואין צללים בזמן אמת.

איור 14. הגדרות Mesh Renderer עבור הרינדור של איור 13.

תאורה בזמן אמת וסוגי תאורה

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

לכל סוג תאורה יש עלות שונה לחישוב התאורה. ברשימה הבאה מפורטים כל סוגי האור:

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