DCSIMG
October 2010 - Posts - הבלוג של צביקה פאר

הבלוג של צביקה פאר

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

October 2010 - Posts

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 עליו רוצים לעבוד על ידי חלוקתו לתתי פוליגונים .

 

ht2

 

כפי שרואים בתמונה בשורה השניה התהליך של 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) .

 

ht4

 

התהליך של הtesselation מורכב מ חלוקה (sub divition ) של ה primitive ומיפוי כל vertex חדש ל mesh .

 

לצורך תמיכה ב tesselation נוצרו עוד 3 שלבים ב direct3d pipline של direct3d 11:

ht5

שלושת השלבים החדשים אשר מופעים בירוק יעדם תמיכה ב 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 .

 

ht6

כמו כן באמצעות 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 ושימושו.