
Diablo Immortal הוא משחק תפקידים פעולה (ARPG) מרובה משתתפים בחינם, שפותח בשיתוף על ידי Blizzard Entertainment ו-NetEase. Diablo Immortal, פרק חדש בסדרת Diablo, הושק בשנת 2022. המשחק ממלא את הפער בעלילה בין Diablo 2 לבין Diablo 3, ומציג הרפתקה חדשה סביב שברי אבן העולם. השחקנים חוקרים את היבשת Sanctuary כדי להילחם בשדים ובכוחות מושחתים.
בעקבות החדשנות בארכיטקטורת GPU לנייד והפריצות הדרך ביכולות של האצת החומרה, הטכנולוגיה של מעקב קרניים עוברת בהדרגה מהמחשב למכשירים ניידים, והיא הופכת לאחד מהגורמים המרכזיים לעיבוד גרפיקה באיכות גבוהה. חישוב של שיקוף דינמי ריאליסטי מבחינה פיזית הוא תהליך מחשבותי תובעני, אבל יחידת חומרה ייעודית מאפשרת לעשות זאת בפלטפורמות ניידות עם מגבלות צריכת חשמל. הטכנולוגיה מתבססת על מעקב אחר נתיב ההולכה של האור בסצנה בזמן אמת, ומאפשרת לדמות במדויק את התנהגות ההחזרה של משטחים מורכבים כמו מראות, מתכות ונוזלים. עיבוד קרניים מאפשר להתגבר על המגבלות המרחביות ועל שגיאות ההערכה של סכמות רסטרציה מסורתיות, ותומך בביטוי עקבי גלובלי של מקורות אור דינמיים, אובייקטים מחוץ למסך והחזרות אור ברמות מרובות.
ניתוב קרניים בחומרה בנייד
הטכנולוגיה של מעקב קרניים בחומרה כוללת בעיקר שתי פרדיגמות להטמעה: צינור עיבוד נתונים של מעקב קרניים ושאילתת קרן.
צינור עיבוד נתונים של Ray Tracing יוצר צינור עיבוד נתונים מלא באמצעות שלבי שדר (shader) ייעודיים (יצירת קרניים / צומת / שדר של פגיעה קרובה). אמנם אפשר להשיג שליטה מדויקת באינטראקציה של קרניים, אבל צינור עיבוד נתונים של טריאסי קרניים דורש הגדרה עצמאית של צינור עיבוד הנתונים, וכך מוביל לעלייה במורכבות הפיתוח.
לעומת זאת, שאילתות קרניים מאפשרות להפעיל שאילתות קרניים ישירות מ-shaders רגילים של חישוב או קטע, ולכן זוהי טכנולוגיית ליבה ל-ray tracing בנייד. העובדה שאפשר להשתמש בשאילתות קרן בלי צינורות עיבוד נתונים נפרדים לא רק מפשטת מאוד את תהליך הפיתוח, אלא גם מאפשרת ליהנות משלושה יתרונות עיקריים:
- תאימות לסביבות מחשוב הטרוגניות ולחומרה חלקית של מעקב קרניים
- תמיכה בהפעלה על פי דרישה של Ray Tracing בכל שלב של הצללה
- הפחתת השימוש במשאבים, עמידה במגבלות של רוחב הפס והספק בפלטפורמות לנייד ומתן בסיס אפשרי להשפעות מתקדמות כמו תאורה גלובלית דינמית והשתקפות בזמן אמת במשחקים לנייד
ב-Diablo Immortal נעשה שימוש ב-Vulkan כדי לנצל את יכולות המעקב אחר קרני האור בחומרה של ה-GPU. המשחק מחשב את מסלול קרני האור בסצנה בזמן אמת ומביא בחשבון מאפייני חומרים מורכבים כדי ליצור אפקטים פורצי דרך של השתקפות בזמן אמת במכשירי Android.


מבנה ההאצה
מבנה ההאצה הוא הליבה של מעקב קרניים בחומרה. מבנה ההאצה משפר באופן משמעותי את היעילות של בדיקת הצטלבות קרניים באמצעות ארגון נתונים היררכי.
בדרך כלל, המערכת מורכבת משתי רמות: מבנה האצווה ברמה העליונה (TLAS) ומבנה האצווה ברמה התחתונה (BLAS):
- TLAS ממלא את התפקיד של מנהל סצנות – על ידי תיעוד של מטריצת הטרנספורמציה המרחבית (כולל המיקום, הסיבוב והמידה) של כל המופעים של BLAS, TLAS מאפשר את הארגון הגלובלי של סצנות דינמיות. לדוגמה, TLAS מאפשר למפתחים להפיץ מאות מופעים של אותו מודל עץ במיקומים ובתנוחות שונים בסצנה. כך, המפתחים צריכים רק לעדכן את מטריצת הטרנספורמציה של האובייקט הנע בכל פריים, במקום לשחזר את הגיאומטריה.
- BLAS כיחידה בסיסית – ה-BLAS אחראי לקידוד יעיל של הפרטים הגיאומטריים של אובייקט תלת-ממדי יחיד, והוא יוצר מבנה של אינדקס מרחבי באמצעות אלגוריתם היררכיית נפח מוגבל (BVH), כדי שאפשר יהיה לדלג במהירות על אזורים לא רלוונטיים במהלך זיהוי קרניים.
העיצוב ההיררכי הזה מאפשר לצינור עיבוד הנתונים של מעקב קרניים ליצור שרשרת זיהוי יעילה של ray ==> TLAS (מכונה של אובייקט מסנן גס) ==> BLAS (חיתוך מדויק).
הפרדת מודלים דינמיים וסטטיים היא המפתח לצמצום העלות של בניית מבנה האצת ה-GPU:
- מודל סטטי – צריך ליצור את ה-BLAS רק פעם אחת בשלב האינטליקציה, וניתן לעשות בו שימוש חוזר ישירות בעומס הסצנה הבא. כדי למנוע את עיכוב הטעינה של סצנות בקנה מידה גדול, אפשר להשתמש בטכנולוגיית ה-preconstruction האסינכרונית של הפריימים כדי לפזר את המשימה של יצירת BLAS לכמה פריימים.
- מודל דינמי
- מבוססת על אנימציה של שלד – צריך לחשב את נתוני הנקודות (vertices) עם עיבוד גרפי (compute shader) במקביל בכל פריים כדי ליצור מאגר נקודות חדש, ואז להפעיל את העדכון המצטבר של BLAS התואם, כדי למנוע שחזור מלא ולשפר את הביצועים.
- טרנספורמציה של גוף מוצק – אם מדובר רק בטרנספורמציות של תזוזה/רוטציה/זום, אין צורך לשנות את BLAS, אלא רק לעדכן את מטריצת הטרנספורמציה שלו בעולם ב-TLAS ואז להפעיל את תהליך העדכון המהיר של TLAS.
שחזור תקופתי חיוני לשמירה על יעילות מבנה ההאצה בסצנות דינמיות של טרסיית קרניים. כשאובייקטים דינמיים עוברים שינויים משמעותיים בטופולוגיה הגיאומטרית, כמו עיוות או העברה של קודקודים בקנה מידה גדול, ייתכן שהחלוקה המרחבית המקורית תיכשל, וכתוצאה מכך הביצועים של זיהוי ההתנגשויות ירדו במהלך סריקה של קרן. כתוצאה מכך, צריך להפעיל שחזור מלא של BLAS/TLAS הדינמיים מאוד, במקום עדכון מצטבר, בכל N פריימים.
לבסוף, כדי לבצע אופטימיזציה של הביצועים של עיבוד הגרפי באמצעות מעקב קרניים, מומלץ להשתמש באסטרטגיה דינמית ליצירת TLAS על סמך האזור שגלוי לדמות: רק המודלים שנמצאים בתוך סף הרדיוס הפעיל של הדמות נכללים ב-TLAS כדי לצמצם את התקורה של הליבה לחישוב הצטלבות הקרניים.
השתקפויות באמצעות מעקב קרניים
יש כמה יתרונות לשיטה של שיקוף באמצעות מעקב קרניים על פני שיטות מסורתיות, כמו שיקוף במרחב המסך (SSR) ושיקוף במישור (פני שטח פשוטים שמייצגים סצנה בממד אחד). השתקפות באמצעות טריאנגולציית קרניים היא סימולציה פיזית של נתיב האור, שמאפשרת לתעד במדויק אובייקטים דינמיים בתוך הסצנה ומחוצה לה, תומכת בהחזרות טבעיות של אור ממשטחים מעוקלים ולא שטוחיים ומאפשרת ליצור כמה אפקטים של חזרה של אור, כמו מראות. לעומת זאת, SSR מוגבל למידע שגלוי במסך, והשתקפויות שטוחות בדו-מימד נוטות לשגיאות חזותיות או לעיוות בסצנות מורכבות.


בעיקרון, שיקוף באמצעות מעקב קרניים דומה ל-SSR רגיל: שיקוף באמצעות מעקב קרניים מקרין קרניים בכיוון השתקפות קו הראייה, לפי פיקסל, ומחשב את הצטלבות הקרניים עם אובייקטים בסצנה. נקודת הצטלבות שמוחזרת על ידי Ray Query API מכילה מידע גיאומרי (כולל מזהה מכונה, אינדקס גיאומטריה ואינדקס פרימיטיבי) ופרמטרים של רסטרטיפיקציה (קואורדינטות בריצנטריות) ברמת המשולש, אבל לא מכילה נתוני צבע פיקסלים. הפתרון הרגיל משתמש בטכנולוגיית קישור משאבים ללא קישור כדי לקמפל מראש את כל הפרמטרים של הטקסטורה והחומר של הסצנה למערך אינדקס גלובלי. באמצעות המזהים הגיאומטריים שמוחזרים על ידי שאילתה של קרן, אפשר לחפש את המאפיינים הפיזיים של החומר התואם (כמו מפת נורמלים וחספוס) ואז לשלב אותם עם אינטרפולציה של קואורדינטות בריצנטריות כדי לחשב את פרטי ההצללה של פני השטח, ואפשר לשחזר את ערך הצבע האמיתי של הצומת באמצעות רסטרטיפיקציה.
עם זאת, במהלך תהליך ההטמעה, צוות Diablo Immortal גילה שתי בעיות טכניות משמעותיות:
- מודל התאורה נאלץ להיות מאוחד, דבר שהתנגש במערכות השונות של הצללה שנצברו במהלך ההיסטוריה של הפרויקט, והיה מוביל לחוסר התאמה בין החומר המבריק לחומר המקורי.
- מגוון הפורמטים של הנקודות הבולטות (vertices) גורם לירידה ביעילות ההסתעפות של ההוראות בשלב הרסטוריזציה, וזו בעיה גדולה במסגרת תקציב הביצועים המוגבל של המכשיר הנייד.
הצוות של Diablo Immortal השתמש בדרך חדשנית כדי להציג את מאגר החשיפה, כדי להפריד בין עיבוד הגיאומטריה לבין חישובי ההצללה:
- שלב המעקב אחר קרניים – המידע על מיקומי ההיט של הקרניים ברמת הפיקסל מתועד בזמן אמת באמצעות שאילתה של קרן. המזהה המרחבי התלת-ממדי (
InstanceID
עםPrimitiveIndex
) של נקודת הצטלבות מקודד למזהה חשיפה קומפקטי ונכתב במאגר של מרחב המסך. - שלב הצביעה – בדומה לפעולות שמבצעים שיבובי צבע של צמתים ושיבובי צבע של פיקסלים, המזהים הגיאומטריים במאגר החשיפה מנותחים באופן דינמי, מאחזרים את מאפייני הצמתים (כמו קואורדינטות UV ורגילים) ומפות החומר המבוססות על פיזיקה של המודל המקורי, ובסופו של דבר מתבצעים חישובי השיבוב שמשויכים לסוג החומר.
הפתרון הזה מאפשר לחבר נכסי גרפיקה למערכת ההשתקפות של ניתוח קרניים בלי לשנות את הפורמטים של הנקודות או את ה-shaders.
שלבים ספציפיים של רינדור
העברה של שאילתה של Ray
תואם לשלב המעקב אחר קרניים ויוצר מאגר של נתוני נראות לצורך השתקפויות במרחב המסך:
- Color0
- פורמט: R32G32UInt
- R = TriangleID, G = Barycentrics

- עומק:
- פורמט: Depth32F
- D = EncodeAsFloat(InstanceIdx, GeometryIdx)
- מזהה החומר של הצומת מקודד בנקודה צפה של 32 ביט ונכתב למאגר העומק בשביל השלב הבא של שיטת הזיהוי של התאמה לקידוד עומק של החומר.

בהשוואה ל-compute shader, לשאילתת קרן ב-pixel shader יש את היתרונות הבאים:
- שילוב צינור עיבוד נתונים – צינור עיבוד הנתונים מוטמע ישירות בצינורות עיבוד נתונים קיימים של עיבוד גרפי ישיר או עיבוד גרפי מושהה, תוך שמירה על רציפות המצב של צינור עיבוד הנתונים לעיבוד גרפי.
- אופטימיזציה של רוחב הפס בנייד – בארכיטקטורה מבוססת-השברים לנייד, אפשר להפעיל דחיסת lossless על הצ'יפ כשנתוני ההיט של קרן האור נכתבים ל-
RenderTarget
, וכך לצמצם את צריכת רוחב הפס של הזיכרון בהשוואה לפלט המסורתי של שדה החישוב למאגר. - בקרה על כמות הקרניים – ניתן לסמן ולדחות אזורים לא משתקפים באמצעות שלב חישוב מראש בשילוב עם בדיקת סטנסיל.
סימון כרטיס כ'טופל'
בשלב הצביעה (ראו החזרות קרני אור), צוות Diablo Immortal השיג התאמה מהירה של זיהוי באמצעות יחידת החומרה של בדיקת העומק וביצוע צביעה של חומרים בקבוצות עוקבות.
לכל חומר מונפק תהליך ציור במסך מלא. שדה הקוד של הקודקודים משחזר באופן דינמי את המזהה המקודד של החומר הנוכחי. באמצעות בדיקת השוויון של העומק, המזהה מושווה לערכים המקודדים במאגר העומק, ונשמרים רק פיקסלים שהערכים המקודדים שלהם תואמים בדיוק, כלומר הפיקסלים ששייכים למופעי החומר הנוכחיים. הפיקסלים שנשמרו מפעילים את שפת השיזוף (shader) התואמת של החומר.
בשלב הבא, שחזור החומר ברמת דיוק גבוהה מיושם ב-pixel shader:
- פענוח נתוני הגיאומטריה – חילוץ המזהה של המשולש (
MeshID
+PrimitiveID
) וקואורדינטות הבריצנטריות מהמאגר של היכולת לבחון, וטעינת מאפייני הנקודה (מיקום, UV, נורמלית וכו') של המשולש התואם מהמאגר של הנקודות באופן דינמי. מכיוון שכל מודל מופיע בצללית כחומר עצמאי, אין צורך בתכונות מתקדמות כמו קישור. - שחזור של פרמטר פני השטח – חישוב הקואורדינטות של UV בצומת באמצעות אינטרפולציה של קואורדינטות בריצנטריות. מתבצעת רסטרציה בתוכנה כדי לדגום את המפה על סמך נקודות ה-UV שעבר תהליך אינטרפולציה.
- שימוש חוזר בחישוב הצללה – שימוש חוזר ישיר בקוד שדה קיים כדי לשמור על אותו לוגיקה של חומר כמו בצינור העיבוד הראשי לעיבוד תמונה.

לבסוף, המודלים שמשתתפים בפועל בחישוב ההשתקפות מהווים רק חלק קטן מאוד מהסצנה. אפשר לקרוא באופן אסינכרוני את נתוני הזיהוי של מודל ההשתקפות שמוחזרים על ידי ה-GPU כדי להסיר את המודלים או החומרים שלא משתתפים בהשתקפות, וכך לצמצם את מספר הקריאות לציור (קריאה לציור מתרחשת כשחומרים ומרשים נשלחים ל-GPU לצורך ציור) בשלב ההצללה.
שיקוף specular מבוסס-פיזיקה
כדי לקבל שיקוף באיכות גבוהה, משטחים רפלקטיביים מסווגים לאחד משלושה סוגים בהתאם לצורתם:
- ללא השתקפות – אפשר לדלג על חישובי ההשתקפות של המשטחים האלה כדי לחסוך במשאבים. אם המשטח מחוספס מאוד, ההשתקפות הופכת מטושטשת וחיוורת, כך שההשפעה לא בולטת.
- השתקפות במראה – כמו במראה חלקה, התמונה המשתקפת ברורה ולא מטושטשת. מצלמים את הקו ישירות בכיוון ההשתקפות מתוך קו הראייה.
- השתקפות מבריקה – ההדמיה של השתקפות עם מחוספסות מסוימת של פני השטח מתבססת על דגימת החשיבות של GGX, שיכולה להביא בחשבון גם יעילות חישובית וגם דיוק פיזי. ההשתקפות חורגת לכיוון הראשי של ההשתקפות הספקולרית בזמן שהקו מופיע, וכך משפרת את יעילות הדגימה של אזור ההדגשה.
כדי להשיג איכות תמונה שימושית עם צריכת חשמל מוגבלת, צוות Diablo Immortal השתמש בפתרון 1SPP+Denoiser. כלומר, צוות Diablo Immortal לקח דגימה אחת לכל פיקסל,ולאחר מכן השתמש באלגוריתם להפחתת רעש זמני/מרחבי כדי להחליק את כמות הרעש הגדולה שנוצרה כתוצאה משיעור דגימה נמוך.
צוות Diablo Immortal בחר ב-Reflection Denoiser ב-AMD FidelityFX Denoiser, מנגנון סינון רעשי נתונים בעל ביצועים גבוהים שמותאם להשתקפויות מסוג ray-traced ולהשתקפויות במרחב המסך. היתרון העיקרי של הכלי להסרת רעשי השתקפות הוא האלגוריתם המשולב של הסרת הרעש במרחב ובזמן: על ידי מיזוג של הפריימים הנוכחיים ונתוני הפריימים ההיסטוריים (על סמך פיצוי תנועה), בשילוב עם שיטות סינון מרחבי (כמו סינון שמבוסס על שמירת קצוות לפי וריאציה), הכלי להסרת רעשי השתקפות מסיר רעשים ביעילות ומפיק אפקטים חלקים של השתקפות במדגם נמוך מאוד.
כדי להתאים את עצמם למאפיינים של צינורות עיבוד נתונים לעיבוד תמונה שפותחו בעצמם ולעמוד באילוצי הביצועים המחמירים של מכשירים ניידים, צוות Diablo Immortal הטמיע שיפורים ממוקדים והתאמה של הארכיטקטורה במהלך השילוב של AMD FidelityFX Reflection Denoiser.
מעקב קרניים ברמת דיוק גבוהה באמצעות Vulkan
Diablo Immortal פועלת במגוון רחב של מכשירי Android שתומכים ב-Vulkan, שבהם צוות Diablo Immortal השתמש ביכולות החומרה החדשניות של מעבדי ה-GPU ל-ray-tracing. Vulkan הפחית את העלויות ואת החיכוך בפיתוח, וכך אפשר להעביר למשתמשים ב-Android תוכן ואיכות משחק ברמה גבוהה של Diablo Immortal.