יום שני, 29 ביולי 2013

כבד בבלנדר

כבד בבלנדר.

למי שבא לפה כי חיפש מתכונים של כבד טחון...
סליחה, טעות בכתובת.
פה זה Blender!

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

הבעיה: פוליגונים.

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

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

ישנם כמה כלים בבלנדר שמאפשרים מחיקת קודקודים מיותרים במודל:

מודיפייר Decimate:

המודיפייר הזה בנוי למחיקת פוליגונים מהמודל ע"י שימוש באחת מ-3 שיטות:
קריסה (Collapse) - המודל מתחלק למשולשים והמודיפייר מבטל חלקים מהמודל בהתאם ליחס הרשום כ-Ratio.
ביטול חלוקה (Un-Subdivide) - שימושי למודלים המכילים פוליגונים מיותרים שנוצרו ע"י חלוקה (Subdivide)
שיטוח (Planer) - המודיפייר מוחק קודקודים בהתאם לזווית אותה הם יוצרים, בהתאם להגדרת המשתמש, כך ניתן בעצם למחוק את כל הקודקודים היוצרים זווית הקטנה מ-1 מעלות (משטח שטוח לגמרי) ולהשאיר את כל אלו היוצרים קימור מסוים כדי לא לאבד פרטים.
המודיפייר לא עובד במצב עריכה, אלא רק במצב אובייקט, כמו כן המודיפייר מציג את כמות הפאות שנשארו אחרי השינויים (Face Count).
על פי הסתכלות על מצב המודל וכמות הפאות שנותרו נוכל לדעת כמה יעילה כל שיטה על המודל המסוים (ישנם שיטות שיותר יעילות במידול אורגני וישנן כאלו שיותר יעילות למודלים מכניים)
בתמונה הבאה אפשר לראות במודל המסומן (הימני) את כל הקודקודים הקיימים ובמודל השמאלי (שמצויר בשחור) את מה שנשאר אחרי המודיפייר (השגנו שם ירידה מ-146 פאות ל-19 בלבד!)

שיטות למחיקת פוליגונים מיותרים

כלי המחיקה - Limited Dissolve:

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

עבודה עם מודיפייר SubSurf:

המודיפייר הזה מאפשר לבנות מודל ברזולוציה נמוכה ע"י שימוש במודל בעל כמות פוליגונים קטנה יחסית אבל עם הוראות מיוחדות היכן להוסיף בצורה אוטומטית פירוט. המודיפייר הזה שימושי מאד במידול של צורות בעלות קימורים והוא כ"כ חשוב שהקצו שלו (כמעט) את כל מקשי המספרים בשורה העליונה...
Ctrl+1 עד Ctrl+5 וגם את Ctrl+0 כדי להקצות מצבי חלוקה מ-1 עד 5 ולביטול (חלוקה 0).
בטח הרחתם את השאלה באויר... המודיפייר הזה מוסיף פוליגונים, איך זה אמור לעזור לי להפחית אותם?
ובכן, ברגע שנדע איך לבנות מודלים ברזולוציה גבוהה בעזרת המודיפייר הזה, ניתן יהיה בקלות לקבוע באיזו רמת חלוקה המודל ירונדר ובאיזו רמת חלוקה המודל יוצג על המסך. זה יכול לחסוך המון וכמובן שבמצבים קיצוניים ניתן לכבות את המודיפייר לגמרי כך שבמסך יוצגו המודלים עם כמות הפוליגונים הנמוכה ביותר.
לפעמים ממדלים מודל כך שבצילום תקריב יוכלו לראות את כל הפרטים הקטנים אך מרחוק כמעט ולא רואים את הפרטים. גם כאן נוכל להנות מהמודיפייר הזה ולהגדיר את עוצמת החלוקה בהתאם לגודל המודל בתמונה. (ניתן אפילו לעשות זאת באופן אוטומטי ע"י דרייברים כך שהעוצמה תהיה תלויה במרחק שבין המודל למצלמה למשל - שימושי מאד באנימציה)
שיטות לשינוי רמת ההשפעה של החלוקה
ברמת העיקרון המודיפייר הזה מחליק כל דבר, ניתן לקבוע את השפעת ההחלקה בשני אופנים:
הוספת לופים - כיוון שהמודיפייר מוסיף חלוקות בין הקודקודים, הקימור שייווצר בין קודקודים הקרובים זה לזה יהיה יותר קטן. זו שיטה מאד בזבזנית כיוון שהיא מוסיפה עוד קודקודים אבל מצד שני מאפשרת הוספת חלוקות באיזור הדורש יותר פרטים (תלוי איך מסתכלים...)
שימוש ב-Crease - בשיטה הזו מגדירים לכל קו (Edge - אדג') במודל את העוצמה שבו המודיפייר ישפיע. "1" = המודיפייר לא ישפיע כלל, "0" = השפעה מלאה, כל ערך בין השניים - השפעה חלקית בהתאם לערך.
כאשר מזינים ערך בצורה ידנית (Shift+E) ורוצים לחזור "אחורה" (למשל לרדת מ-0.8 ל-0.3 יש להכניס ערך שלילי: -0.5)
זו השיטה היחידה בעצם בה ניתן להפעיל SubSurf על המודל ולהשאיר לו קצוות חדים לגמרי:
SubSurf+EdgeSplit = שילוב מנצח
בתמונה הנ"ל כל הקווים של הקובייה מסומנים עם Crease של 1 חוץ מקו אחד שמסומן כ-0, התוצאה: רק באותו קו התבצעה החלקה וכך קיבלנו את הצורה הזו, כדי שההחלקה תוצג בצורה חלקה שיניתי את מצב התצוגה של המודל מ-"Flat" ל-"Smooth" והוספתי את המודיפייר EdgeSplit כדי שמצב ה-Smooth יכנס לעבודה רק באיזורים שאינם חדים (שהפינות החדות יישארו חדות)

עוד משהו חשוב: צריך לקחת בחשבון שעוד מעט יכנס לבלנדר תמיכה ב-Subdiv של פיקסר, כאשר השדרוג הגדול מבחינת בלנדר (לדעתי) הוא שהפיצ'ר של פיקסר תומך בריבוי משימות וב-CUDA, מה שאומר במילים פשוטות שמודל שמודל לפרטי פרטים ללא שימוש בחלוקה יהיה הרבה יותר כבד לתצוגה ולרינדור מאשר מודל שהשיג את הרזולוציה שלו ע"י ה-Subdiv כך שמאד יהיה משתלם לעבוד בשיטת החלוקות והוספת ה-Crease למקומות המתאימים.
(ונחמד יהיה להתרגל מעכשיו...)

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

שכפול אובייקטים

לפעמים אנו רוצים שאובייקט מסוים יופיע מספר פעמים בסצנה (למשל כיסאות באולם הרצאות), כל שכפול כזה בעצם מכפיל את כמות הפוליגונים בסצנה.
ישנם 6 אפשרויות לשכפל אובייקט (שעולות לי כרגע בראש):
(לצורך מדידת הביצועים עשיתי SubSurf ברמה 5 לקובייה ושכפלתי אותה 300 פעם - 10*10*3)
1) שכפול עם Shift+D: השכפול הזה יוצר שני אובייקטים נפרדים לגמרי למעט החומר שהינו משותף (כאשר משנים באחד גם בשני ישתנה).
ביצוע: סימון האובייקט/ים שרצוננו לשכפל ולחיצה על Shift+D, התוכנה תעביר אותנו אוטומטית למצב הזזה כדי שנוכל למקם את האובייקט החדש.
ביצועים: אוכל זיכרון (כ-800MB בדוגמה שלעיל), תזוזה במסך: 9.5fps, רינדור: כמה שנית, קשה היה למדוד וכך בכולם.
יתרונות: ניתן לערוך כל אובייקט בפני עצמו מבלי להרוס אחרים, ניתן למקם בצורה חופשית כל אובייקט.
חסרונות: אוכל זיכרון, צריך לעדכן כל אובייקט בנפרד במידה ורוצים שכולם יהיו זהים לחלוטין.
2) שכפול עם Alt+D: השכפול הזה זהה לקודם רק שכאן הנתונים של האובייקט עצמו (מה שרואים במצב עריכה) יהיו משותפים בין שני האובייקטים, כלומר, אם אני עורך אובייקט אחד, גם השני יתעדכן בזמן אמת בשינוי.
ביצוע: כמו שיטה 1. ביצועים: כמעט כמו 1, התזוזה במסך טיפה יותר איטית (מה שהיה לי מוזר...)
יתרונות: מצוין לשכפול אובייקטים זהים לחלוטין ששינוי האחד דורש תיקון לכולם.
חסרונות: אוכל זיכרון, לא ניתן לערוך אובייקט בודד מבלי להשפיע על השאר.
3) שכפול ע"י שימוש במודיפיירים של Array: ניתן לשכפל אובייקט על פי צירים או מסביב לאובייקט מסוים.
ביצוע: מוסיפים מודיפייר Array לאובייקט, כדי שישוכפל בכל הצירים יש לייצר מודיפייר לכל ציר ולפרט כמה פעמים האובייקט ישוכפל.
ביצועים: גם אוכל זיכרון, לוקח לו זמן לארגן את כל האובייקטים על המסך אבל אח"כ קיבלתי תזוזה של כ-12fps שזה מדהים!
יתרונות: ניתן לכבות והדליק כשרוצים (אין צורך למחוק, עובדים עם אובייקט אחד בלבד), ניתן לשחק עם ההגדרות ולקבל תוצאות מעניינות (ישנם כל מיני שכלולים שם)
חסרונות: קורס לפעמים, לא יציב. לוקח לו זמן לבנות את המערך (אם הוא גדול / מורכב מאובייקטים כבדים), לא ניתן למקם את האובייקטים בצורה חופשית לגמרי איפה שרוצים.
4) שכפול ע"י DupliVerts/DupliFaces: מוסיפים אובייקט נוסף כך שהאובייקט ישוכפל על כל פאה/קודקוד של האובייקט הנוסף.
ביצוע: מוסיפים לסצנה אובייקט נוסף, מגדירים את האובייקט שרוצים לשכפל כ"בן" לאובייקט הנוסף. באובייקט הנוסף בטאב האובייקט מגדירים את צורת השכפול ובזה זה נגמר.
בדוגמה שבתמונה שכפלתי כדור לפי הקודקודים של הקובייה, הכדור הוזז בציר ה-Y הלוקאלי והגלובאלי ולכן הכדורים לא נמצאים בדיוק על הפינות (עשיתי את זה כדי להרחיק אותם וגם כדי שיהיה מקום לראות את הכיתוב)
DupliVerts
ביצועים: לא אוכל זיכרון (רק כ-35M), לא מצריך זמן בניה ארוך של ה-BVH (כמו בשיטות הקודמות), זמן רינדור נראה קצר יותר. התצוגה במסך כמעט כמו בשיטה 2.
יתרונות: אפשר לרנדר המון אובייקטים בצורה הזו מבלי להעמיס על הכרטיס. ניתן למקם בצורה קלה יחסית את האובייקטים ע"י הזזת הקודקודים/פאות לאן שרוצים וכו'.
חסרונות: האובייקט המקורי עדיין נשאר על המסך (לא ניתן להעלים אותו או להעיף אותו או להעביר לשכבה אחרת אבל גם לזה יש קומבינה), לא ניתן גם להעלים וכו' את אובייקט האב (למרות שבמצב שכפול קודקודים ניתן בהחלט למחוק את כל הפאות שלו וכך בעצם להעלים אותו מהרינדור)
5) שכפול ע"י יצירת קבוצה מהאובייקט יצירת אובייקט חדש מהקבוצה ושכפול שלו ע"י שאר השיטות.
ביצוע: סימון האובייקט ולחיצה על Ctrl+G ונתינת שם לקבוצה (מופיע בסרגל השמאלי) או שימוש בקטגורית הקבוצה בטאב האובייקט (אפשר לראות את המילה Groups בתמונה שלמעלה), אח"כ, יצירת אובייקט חדש בתפריט הוספת אובייקט, רק שהפעם יורדים עד למטה היכן שכתוב: Group Instance ובחירת הקבוצה. ואז ניתן לשכפל כמו קודם או להוסיף את אותו אובייקט מספר פעמים.
ביצועים: לא אוכל זיכרון, כל השאר פחות או יותר נורמלי.
יתרונות: ניתן למקם איפה שרוצים, ניתן לחבר כמה אובייקטים ביחד. חסרונות: לא ניתן לערוך, צריך לחפש את אובייקט המקור.
6) שכפול ע"י שימוש במערכת חלקיקים (Particles):
ביצוע (על קצה המזלג): הוספת אובייקט חדש, הוספת מערכת חלקיקים מסוג Hair (שיער) בטאב החלקיקים (השני מימין שנראה כמו כוכבים) והוספת האובייקט שרוצים לשכפל ע"י הוספתו בקטגוריה: Render ובחירה ב-Object או Group (תלוי מה מוסיפים). ביצועים: תצוגה יותר מהירה, אוכל זיכרון טיפה יותר מאשר שיטה 4.
יתרונות: מאפשר משחק מטורף, אנימציות וכו' וכו'. מאפשר תצוגה של האובייקטים המשוכפלים בלבד (ניתן להסתיר את המקור וגם את האובייקט המשכפל), ניתן להגדיר הגדרות שונות לתצוגה ולרינדור.
חסרונות: מערכת מסובכת שצריך ללמוד, ליגה אחרת.

השוואה בין שיטה 4 לשיטה 6:

סצנה: אובייקט (הקוף) מוחלק ברמה 6 (SubSurf) רק לזמן הרינדור, מוכפל על רשת של 100*100 קודקודים.
אלו הן התוצאות:

שכפול ע"י Duplication:

תזוזה במסך ללא מודיפייר חלוקה: fps2.47
זמן רינדור (מודיפייר מצב 6): 2:22.35
זיכרון כרטיס מסך: 1010MB
זיכרון במצב תצוגה: (24.21M (0.11M במצב רינדור: (38.59M (91.66M
זיכרון רינדור (מה שמופיע בחלון הרינדור): 839.20M
זיכרון במנהל המשימות: 330M ,בזמן רינדור: 1,799,664

שכפול ע" Particles (חלקיקים):

תזוזה במסך ללא מודיפייר חלוקה: fps2.32
זמן רינדור (מודיפייר מצב 6): 2:22.13
זיכרון כרטיס מסך: 1010MB
זיכרון במצב תצוגה: (35.42M (0.11M במצב רינדור: (49.46M (91.66M
זיכרון רינדור (מה שמופיע בחלון הרינדור): 839.20M
זיכרון במנהל המשימות: 340M ,בזמן רינדור: 1,809,736M

שיכפול ע"י Array:

כבד מאד, משכפל בצורה אמיתית ולא משתמש ב-instanse (היה נראה מהיר בדוגמה שלמעלה אך למעשה לא יציב)
הורדתי את כמות השכפולים ל-100 כפול 20 (במקום כפול 100)
התוכנה שקלה יותר מ-5GB בזיכרון!!
הכנת האובייקטים לרינדור - נצח (לא נגמר גם אחרי הרבה זמן)
ב-99*99 הכרטיס קרס כמובן.

טוב, זהו בינתיים.

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