Hardware Tessellation
אחת הבעיות הגדולות שיש לנו בסימולטור הינה אובייקטים תלת מממדיים המכילים כמות עצומה של פוליגונים ישנם אובייקטים המגיעים לסדר גודל של מיליון פוליגונים באוביקטים כאילו הVertex Buffer יכול להגיע לסביבות 30M הindexBuffer יכול להגיע ל 15M .כאשר יש מספר אוביקטים כאילו מפורטים בscene המרונדרים בLOD 1 המערכת נחנקת גם בחומרה מקצועית ביותר .
בעיה נוספת שיוצרים אובייקטים כאילו גדולים הינה ברגע שצריכים לבצע חישובים כדוגמת Collosion Detection הדבר כמעט בלתי אפשרי מכיוון שמעבר על כל ה vertex ים בחישובים דורש כח חישוב רב .
בעבר כבר הומצאו הרבה פיתרונות לבעיה כדוגמת Bump Maps שהינה texture resource המכיל ערכי Normal של surface .כאשר משתמשים בטכנולוגיה של bump map ב pixel shader בזמן חישוב את עוצמת האור של pixel מתחשבים עם בערך הדגם מ Bump map וכך יוצרים אשלייה יש משטח לא חלק , זו שיטה שאומנם עובדת ובהרבה אפליקציות משתמשים בה אל היא די פרמטייבית בעלת הרבה חסרונות בעיקר מכיוון שהיא בעצם לא משנה את האוביקט ואז לדוגמא הצל של האוביקט שונה ממה שהוא היה צריך להיות במציאות .
השיטה שכרגע נחשבת לטובה ביותר הינה displacement map שיטה זו בניגוד ל שיטות כמו bump mapping, normal mapping, and parallax mapping כן משנה את מיקום הvertex . (בהזדמנות אני אכתוב על displacement map לעומק ).כדי להשתמש ב displacement map יש להכין את ה mesh עליו רוצים לעבוד על ידי חלוקתו לתתי פוליגונים .
כפי שרואים בתמונה בשורה השניה התהליך של Displacment map מתחיל על ידי mesh בעל רזולוציה נמוכה העובר פעולת tesselation כלומר כל vertex מחולק לתת פוליגונים אשר מוזזים בשלב השני על פי הdisplacment map. השורה הראשונה באיור מציגה את tessaltion של map לפי רמות .
לשיטה הזו גם יתרונות לגבי lod של פריטים ב scene לדוגמא אם ניקח עדר של חיות ,בעלי החיים שאנו רוצים ל רנדר עם lod גבוהה אנו נבצע להם פעולת tesselation עמוקה לאומת חיות שנמצאות רחוק מהמצלמה ועליהם או שלא נבצע כלל או שנבצע tesselation ברמה נמוכה .
פעולת הtesselation צורכת כח חישוב רב שעד לא מזמן לא היה אפשרי לבצעו ב render חי של משחק וכד , אפליקציות שהיו צריכות לבצע tesselation ביצועו את הפעולה ב offline .
ב Direct3d 10 כבר התחילו לנסות ולפתור את הבעיה על ידי חלוקת הmesh לתת פוליגונים באמצעות הGeometry shader , זה עבד בחומרה חזקה בצורה סבירה אבל עדיין זה לא היה זה .
Direct3d 11, כבר תומך בפעולה הזו מול רכיבים ייעודיים בחומרה שמטרתם לבצע את פעולת הdisplacment . (המוצר הראשון שתמך ביכולת הזו אומנם בצורה פחות חזקה הינו הxbox 360 ).
פעולת הtesselation מתבצעת מול כל סוגי הprimitive או ה patches ( ב Direct3d 11 נוספו עוד סוגי resource בנוסף לprimitive שיכולים להיכנס ל Input assembler stage שמיועדים לתמיכה ב tesselatio ה petches) .
התהליך של הtesselation מורכב מ חלוקה (sub divition ) של ה primitive ומיפוי כל vertex חדש ל mesh .
לצורך תמיכה ב tesselation נוצרו עוד 3 שלבים ב direct3d pipline של direct3d 11:
שלושת השלבים החדשים אשר מופעים בירוק יעדם תמיכה ב hardware tesselation .
כאשר 2 מהם הם ניתנים לתכנות ואחד הינו קבוע אבל אפשר לשלוט על הפרמטרים של דרכי פעולתו .
הVertex shader
מבצע את אותן הפעולות כמו בעיבודים שאינם כוללים tesselation
אם זה טיפול בכל הנושא של transformation של המרות ל מרחבים הרצויים של ה vertexים וכד
הHull Shader
זהו שלב ההכנה ל tesselation זהו שלב שהוא fully programmable
לשלב הזה יש שני תפקידים
1.לקבוע את מקדם החלוקה של כל נקודה: tessellation factors , כל נקודה יכולה לקבל ערך בין 1 ל 64 (כאשר ערכים שלא בתחום כמו 0 יגרמו לנקודה לא להשתתף בתהליך ) בכניסה לפונקציה שמבצעת את הtesselation מקבלים את כל הנקודות בpatch עבורן יש לקבוע את הערך של ה tessellation factors , היתרון בזה שאפשר לקבוע לכל נקודה באופן פרטני את ערך ה tesselation שלה הינו לצורך טיפול בlod )
2.התפקיד השני של ה hull shader זה לפעמים צריך לבצע טרנספורמציה של הנקודה בהתאם לאלגוריתם שיתאים ל tesselation לא תמיד מתבצעת טרנספורמציה בשלב הזה הרבה פעמים הcontrol points מעוברות כמו שהן .
הכניסה ל Hull shader ישנם בין 1 ל 32 נקודות שמרכיבות את ה patch עליו צריכים לבצע tesselation
והוא כאמור מוציא הם את הcontrol points שעברו טרנספורמציה אם נדרשת ואת ערכי ה factor .
כמו כן באמצעות attribute על הפונקציה של ה hull shader בדומה לattribute שלC# ב net . נקבעים פרמטרים בשביל השלב הקבוע של ה tesselation .
ה Tesselator
זה בעצם השלב שמבצע את פעולת הtesselation הוא אינו programmable אבל אפשר לשלוט עליו באמצעות פרמטרים התוצאה של שלב זה הינם בערכי uv של texture .
הDoamin Shader stage
הינו השלב שתפקידו לבצע את הטרנספורמציה של התוצר של ה tesselator שבא בצורת ערכי uv בחזרה לvertex ים .
הVertexים שנוצרו ב Domain shader ממשיכים ל geometry shader ומשם ההתנהגות של ה pipeline רגילה לחלוטין .
בpostים הבאים אני אפרט על כל השלבים , אופן התכנות שלהם וכמו כן אכתוב על הdisplacement map ושימושו.