UI פוסט 3: OpenGL vs. DirectX
זהו פוסט המשך לפוסט הקודם "Swing vs GDI" שעסק בסקירה של מנועים גראפיים של מערכות הפעלה. כמו כן הראתי טבלת השוואה קטנה בין שני המנועיים.
(אפשר לקרוא את הפוסט הזה גם ללא קשר לפוסטים הקודמים)
UI פוסט 3: OpenGL vs. DirectX
בהמשך לנושא הקודם שנגע במנועים גראפיים כמו GDI ו-Swing, אגע במנועים גראפיים נוספים, שעובדים בטכנולוגיות DirectX ו-OpenGL.
כפי שמנועי GDI או Swing נועדו ל"ציור" של אובייקטים גראפיים דו-ממדיים (בעיקר פקדים של טפסים וכו'), DirectX ו-OpenGL נועדו ל"ציור" אובייקטים גראפיים דו-ממדיים ותלת-ממדיים (מדמים אפקט של תלת מימד בעזרת טרנספורמציות גראפיות של צורות דו-ממדיות על המסך, על כך יפורט בהמשך).

קצת היסטוריה:
בעולם האנושי התקשרות החזותית מתבצעת ע"י פירוש (אינטרפרטציה) של צורות, לרוב הצורות הנם אובייקטים תלת-ממדיים מוחשיים, כגון: חפצים, אנשים ובעלי חיים; בעלי ממדים בעולם האמיתי. המוח האנושי מתרגם אותות שהוא מקבל מהעיניים לתמונות בהתייחסות למיקום החפץ במרחב, פרמטרים נוספים: חוזק האור (תאורה), צבעים, צללים ועוד רבים אחרים. האדם המודרני מבטא את המחשבה החזותית בצורת תמונות ועל מנת להציג חפצים תלת-ממדיים הוא המציא שיטות שונות כמו ציור בפרספקטיבה, הצללות, שינוי צבעים ועוד.
עם ההתפתחות של המחשבים, התפתחו גם התקנים שמסוגלים להציג מידע חזותי כמו: טקסטים ותמונות. בחלק מן ההתקנים האלה נכללים כרטיסים גראפיים (כרטיסי מסך); כרטיסים אלקטרוניים משוכללים אשר מותקנים במארז המחשב, כרטיסים אלה מספקים יכולת "ציור" של מידע חזותי על גבי המסך. בשנים האחרונות חלה התפתחות גדולה בהתקנים אלה וכיום הם מציידים ברכיבי זיכרון עצמאיים, מעבדים מתמטיים ורכיבים מיוחדים נוספים. אם בעבר חלק גדול מהחישובים של המידע חזותי נעשה ע"י ה-CPU (מעבד ראשי של המחשב), אז היום זה מתבצע בכרטיס גראפי, רוב הכרטיסים החדשים מציידים במעבד ייחודי אשר "מתמחה" ביכולות חישוב של תצוגות תלת-ממדיות. כרטיס מכיל מעבד גראפי, אשר נשלט ע"י התוכנה (דרייבר), תוכנה מקבלת פקודות על מנת להציג אובייקטים תלת-ממדיים על גבי המסך, לכל אובייקט ישנם פרמטרים כמו: גודל, צורה, צבע, גוון, טקסטורה ועוד.
מפתחי תוכנה משתמשים בדרייבר על מנת להפעיל את הכרטיס. עבודה עם דרייבר של חומרה אינה קלה, לכל יצרן יש דרייבר עם ממשק API שונה (לאחרונה נעשים מאמצים לקבוע סטנדרטים קבועים לכל היצרנים הגדולים), יש להכיר את מגוון הפקודות של הממשק, הפקודות יחסית מסובכות לשימוש, בד"כ מפתח שמגיע מתחום של תכנות בשפות-העל והעולם של תכנות מונחה עצמים לא "יאהב" את ה-API של החומרה. - כאן בא לעזרה מנוע גראפי תלת-ממדי, ש"מתווך" בין מפתח תוכנה לבין הדרייבר של החומרה.
מנוע גראפי - מהווה שכבה לוגית (שכבה של תוכנה) מעל דרייבר של החומרה (במקרה שלנו - כרטיס גראפי). שכבה של מנוע גראפי מכילה ממשק עם פקודות, שבעזרתן ניתן לשלוט בדרייבר של רכיב החומרה. מנוע גראפי הנו מתווך (Proxy) בין הממשק של הדרייבר לבין השכבת התצוגה של היישום. מנוע גראפי "מכיר" פקודות ספציפיות של כל יצרן החומרה, מספק ממשק נוח ואחיד לכל פלטפורמה שעליה הוא מותקן.
לדוגמא: אני מעוניין לפתח מחשק מחשב תלת-ממדי. לשם כך אני זקוק לכרטיס גראפי בעל יכולות עיבוד מסוימות, בשוק המחשבים קיימים מגוון כרטיסים גראפיים ולכל כרטיס יש ממשק ומאפיינים ייחודיים. אני מעוניין שהמשחק יוכל לעבוד עם כל הסוגים הנפוצים של כרטיסים גראפיים - בעיקר שהוא יספק לי יכולות גראפיות נחוצות. המטרה היא לפתח משחק מחשב ללא קשר לסוג החומרה שעליה המשתמש ירצה להפעיל את המשחק. מנוע גראפי יהווה ממשק API שמולו אני אעבוד, עליו אפתח את הצד הגראפי של המשחק, ומנוע יתרגם את הפקודות לאלו המובנות לדרייבר החומרה.
לסיכום: מנוע גראפי מהווה חוצץ לוגי בין המפתח לדרייבר חומרה, מפתח לא צריך להכיר את הממשקים ואת הפקודות שמפעילות את החומרה, למעשה הוא תמיד עובד מול אותו ממשק שמוכר לו. היצרן של כרטיס גראפי מתאים את הממשק של הדרייבר לדרישות של מנוע גראפי, או לחילופין היצרן של המנוע הגראפי מתאים את המנוע לסוג החומרה עליה הוא אמור לשלוט.
מנוע גראפי לתלת-ממד
תיאור חזותי של אובייקטים תלת ממדיים מתבצע בעזרת חומרה מיוחדת ו/או בעזרת תוכנה מיוחדת.
בעבר הלא רחוק החלו להתפתח תוכנות עם יכולת תצוגה של אובייקטים תלת-ממדים, חלק גדול מהתוכנות הללו שייך למשחקי מחשב. חברות תוכנה שייצרו משחקים פיתחו מנועים גראפיים משלהם ועם השנים חלק מהן עברו לפיתוח של מנועיים גראפיים בלבד, כמוצר עיקרי; אותו הן משווקות לחברות אחרות המפתחות תוכנות בעלות יכולת תצוגה תלת-ממדית.
כיום ישנם שני מנועים גראפיים דומיננטיים בשוק התוכנה:

OpenGL
מתוך האתר ויקיפדיה:
- OpenGL (Open Graphics Library) הוא ממשק תכנות יישומים ליצירת תוכנות שמייצרות גרפיקה תלת ממדית ממוחשבת (וגם דו-ממדית). הממשק מורכב מיותר מ-250 קריאות פונקציות שונות שיכולות לשמש לציור של סצנות תלת-ממדיות מורכבות מפרימיטיבים (אובייקטים) פשוטים. OpenGL פותחה ע"י חברת סיליקון גרפיקס (Silicon Graphics Inc.) בשנת 1992 והיא פופולארית בתעשיית משחקי הוידיאו, שם היא מתחרה בפלטפורמות של חברת מיקרוסופט המשתמשות ב־Direct3D. שימוש נרחב ב-OpenGL ניתן למצוא בסביבות מציאות מדומה, סימולציות מדעיות, הצגת מידע, סימולאטורים מדמי טיסה ופיתוח משחקי מחשב.
- בנוסף ניתן לציין כי ממשק OpenGL שייך לחבילת פיתוח (SDK - Software development kit) אשר מופצת בחינם ויש גרסאות שונות להתקנה במערכות הפעלה שונות, ניתן לומר שזהו מנוע גראפי רב-תחליטי עבור פלטפורמות (מע' הפעלה) שונות.


DirectX
מתוך האתר ויקיפדיה:
- DirectX היא ספרייה (DLL - Dynamic link library) שפותחה על ידי מיקרוסופט לסביבת Windows, מטרתה לתת גישה ישירה לחומרת המחשב, ובכך להאיץ ביצועים. מטרה נוספת של ספרייה זו היא להנגיש למתכנתים פונקציות לגרפיקה דו ממדית ותלת ממדית, מבלי שיעברו התמחות מיוחדת בכך. הוספת ספרייה זו גרמה לכך שפיתוח משחקי מחשב למשל יהיה קל ומהיר מאשר קודם.
בחלק מן המקורות DirectX מוזכר יחד עם Direct3D:
Direct3D
- מהווה רכיב מרכזי של DirectX האחראי על רינדור (עיבוד והצגה נכונה) של תלת-מימד. הטכנולוגיה משתמשת בהאצת חומרה (כרטיס הגראפי).
- כמו OpenGL, DirectX הנה חבילת פיתוח (SDK) שמופצת בחינם, לעומת OpenGL חבילה זו יכולה "לרוץ" רק במערכות הפעלה של מיקרוסופט (ללא קשר לניסיונות של קהילות מפתחים בקוד-פתוח, להתאים חבילה למערכות הפעלה אחרות כמו לינוקס. הרצה של משחק הבנוי על חבילה הנ"ל דרך אימולטור כלשהו הנה איטית ומלווה בבעיות ברוב המקרים).


OpenGL vs. DirectX
לשני מנועיים יש מאפיינים משותפים וייחודיים, ולשניהם יש חסרונות ויתרונות:
|
פרמטר השוואה |
DirectX |
OpenGL |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|

טבלת השוואות נוספת בתחום הרינדור התלת-ממדי:
Feature OpenGL DirectX
Vertex Blending N/A Yes
Multiple Operating Systems Yes No
Extension Mechanism Yes Yes
Development Multiple member Board Microsoft
Thorough Specification Yes No
Two-sided lighting Yes No
Volume Textures Yes No
Hardware independent Z-buffers Yes No
Accumulation buffers Yes No
Full-screen Ant-aliasing Yes Yes
Motion Blur Yes Yes
Depth of field Yes Yes
Stereo Rendering Yes No
Point-size/line-width attributes Yes No
Picking Yes No
Parametric curves and surfaces Yes No
Cache geometry Display Vertex Buffers
System emulation Hardware not present Let app. determine
Interface Procedure calls COM
Updates Yearly Yearly
Source Code Examples SDK
את הטבלה המקורית אפשר למצוא כאן: http://www.cprogramming.com/tutorial/openglvs.html
ראו בהמשך פוסט על ה"מהפכה ב-UI", אשמח לקבל הערות/תיקונים לגבי הפוסט. לרשימת הפוסטים של הסדרה לחצו כאן.