פרויקט משחק מגוף ראשון ב OpenGL.

  • פותח הנושא R0SS
  • פורסם בתאריך

R0SS

New member
תודה על הטיפים חח

1. אני תאמת התכוונתי לבנות את זה ממש בקרוב, בינתיים הייתי מריץ Fraps ברקע כדי לראות את הפריים-רייט.
2. כן קוראים לזה דלטא ואני יעשה יעשה את זה אחרי שאני יצור את החלק הראשון בהודעה.
3. אני טוען הכל בהתחלה (בחלון של טעינת שלב) בגלל שהמפות במשחק לא הולכות להיות גדולות ודינמיות מידי ככה שאני לא רואה צורך בטעינה בזמן אמת ברגע זה.
4. יש לי מערכת Culling בסיסית ברגע זה שעובדת על מידע סטטי שהכנסתי לה, ככה שאני יודע מה לרנדר ומה לא ביחס למיקום השחקן עצמו מעבר לכך שעשיתי בדיקה והגעתי לכך שאני מסוגל לרנדר מודל של 150 אלף ורטרקסים ועדיין לשמור על 300-400 FPS שזה די אדיר לדעתי.
5. כן זה גם קטע שדאגתי לו חח.
6. אני מכיר את המנגון של BSP מעבר לכך שלמדתי רבות מהסורס של ID TECH 2 שהוא במקרה המנוע של Quake2 אבל אני לא רואה סיבה להשתמש ב BSP ברגע זה כי המשחק שלי לא יהיה כבד ומורכב כל כך שדבר כזה יהיה נחוץ לי.
7. כן חשבתי על צללים עוד בהתחלה ואני די סגור על כך שאני ישלב דווקה Volume Shadows ולא Shadow Maps (כי זה מצריך שימוש של שיידרים ברוב המקרים) מעבר לכך אני גם משתמש ב Light Maps ביחד עם MultiTexture כדי ליצור אויירה ריאליסטית יותר בכמה שפחות חישובים מיותרים.
8. אני יודע תודה חחח.

כמו כן ראיתי את הדמו שלך ^_^
אהבתי מאוד את העורך שלך ותגיד אתה משתמש ב BitMap Fonts או שאתה טוען TTF או משהו ?
וכמו כן אתה משתמש בשיידרים ?
 

R0SS

New member
פרויקט משחק מגוף ראשון ב OpenGL.

שלום לכם, אולי חלק מכם מכירים אותי כבר ויודעים על מה מדובר.
לאלה שלא רציתי לשתף אותכם בפרויקט האחרון שלי שהתחלתי לפני כחודש פחות או יותר.
הרעיון התחילה בעקרון מהתערבות שלי ושל חבר שאנחנו יכולים לכתוב בקלות את Wolfenstein 3D שנוצר ע"י ID Software.
אני החלטתי להשתמש ב Java ביחד עם Lwjgl על מנת להשתמש ב OpenGL והוא בחר לעשות את זה עם ++C ועם Ray Casting.
אחרי זמן מה הוא החליט לזנוח את הרעיון אבל אני לקחתי את הפרויקט לשלב אחד קדימה והחלטתי ליצור משחק משלי לשם שינוי.
אז מאז אני עוסק בפונקציות ומנגנונים חדשים שאני לומד בדרך ב OpenGL.
הרעיון של המשחק בסופו של דבר הוא להיות מין משחק משימות קטנות ובעיקר חשיבה ולוגיקה.
השחקן יצטרך להתמודד מול מכשולים, משימות, מפתחות ושערים וקונספט גרפי מלוטש ונקי.
את ההתקדמות ניתן לראות כאן.


22 לספטמבר:


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

http://www.youtube.com/watch?v=tBiGSIaBSmE


8 לאוקטובר:


הוספתי תמיכה בטקסטורה ומולטי טקסטורה, הוספתי תמיכה במטריאלים, הוספתי תמיכה בתאורה (Point Light) וניהול טווח שלה, הוספתי מצלמה מרחפת, הוספתי התנגשות מלבנית תלת מימדית, הוספתי מערכת ניהול סצינות חכמה Scene Graph ועוד דברים מינורים כמו תמיכה במסך מלאה ואיקון לחלון וכדומה כו כן שיפרתי מערכות קיימות כמו מערכת ניטור הבאגים שמתואמת עכשיו עם ההתנגשות ומערכות אחרות.

http://www.youtube.com/watch?v=bqx2Trjx4RM


ספריות שאני משתמש:


רק הספרייה LWJGL שנותנת לי גישה ישירה וטבעית ל OpenGL (עד גרסאה OpenGL4.2 בפועל).
כמו כן אני רוצה לציין שאני לא משתמש בשיידרים בכלל.
צורת הרנדר שלי עובדת עם Display Lists לעצמים סטטים ו Vertex Buffer Objects עבור עצמים דינאמים שעדיין לא קיימים בפועל.

לסיכום:


אני ישמח לשמוע הצעות, הערות, דעות ורעיונות חדשים.
כמו כן בבקשה תחסכו ממני הודעות סתמיות כמו: "מנועים עושים לך את זה יותר מהר", "למה אתה משתמש בשפה כזאת ולא בשפה אחרת", "למה אתה משתמש ב OpenGL ולא ב DirectX".
אני לא מתכוון לענות להודעות כאלה ותשאלו את עצמכם למה.

יום טוב ^_^
 

De-Panther

New member
בהצלחה! מנועים עושים לך את זה


 

טלד

New member
כמה המלצות

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

אם כבר בחרת לכתוב ב-OpenGL עדיף שלא תשתמש בכל מה שמוגדר בשפה כ-deprecated. אלה פונקציות שמיועדות להוצאה מן התקן ונשארות שם רק בשביל תמיכה בקוד קיים.

בפרט, מומלץ בחום לא להשתמש ב-Display Lists אלא רק ב-Vertex Buffer Objects מכיוון ש ב-Display Lists הגיאומטריה נטענת לזכרון הכרטיס הגרפי כל frame מחדש וב-VBO היא נשארת באופן קבוע בזכרון הכרטיס הגרפי. אתה אולי לא מרגיש את זה כשיש לך מעט גיאומטריה אבל ברגע שיש קצת יותר הפגיעה בקצב הרענון תהיה משמעותית.
המלצה נוספת, תעבוד מההתחלה על שיידרים. כשיגיע הרגע שבו הfixed pipeline לא יספיק תאלץ לכתוב שיידר שכולל תמיכה בכל מה שיש לך.
כשאתה מדבר על עצמים דינמיים, לא ברור מה אתה מתכוון אבל יש סיכוי שניתן להשאיר את המידע ב-VBO סטטי וליצור את השינויים בשיידר.
 

R0SS

New member
אתה טועה בקשר ל Display Lists

אתה טועה בגדול.
ב Display Lists המידע נטען פעם אחת בלבד לזכרון כרטיס המסך ומשם משומש כל פריים ביחס ל VBO שהמידע נשמר באופן חלקי בלבד ומעובד ע"י האוגר (Buffer) מידי פריים.
וזאת הסיבה למה יש הרבה שטוענים שבמקרים מסוימים Disply Lists מרונדרים מהר יותר בהפרש מורגש.
והשתמשתי בגאומטריות של 300-350 אלף פוליגונים ובהחלט מרגישים בהבדל בין VBO לבין Display.
אז למה בעצם מעדיפים אחרי הכל להשתמש ב VBO ?
פשוט, כאשר כל מודל היום צריך לעבור שינוי צורה ברצף הפוליגונים שלו עם אנימציה אז זה יהיה מיותר ביותר לטעון כל אנימציה לזכרון מחדש לכן משתמשים ב Buffer לשם כך.
אבל במשחק שלי אני מתכוון להשתמש במאוד מעט אנימציות לכן Display Lists תהיה בחירה יעילה וחכמה הרבה יותר לפרויקט שלי.
 

טלד

New member
נסגור על לא מדייק

ב- display lists זה מאד תלוי בדרייבר ובכרטיס. יש דרייברים שבהם זה אכן מועלה לזכרון הכרטיס ואף עובר אופטימיזציה מבחינת cache ואז זה קצת יותר מהיר משימוש ב-VBO (אם אתה מקבל הבדל של יותר מ-10% בזמן שלוקח לרנדר פריים אתה כנראה עושה משהו לא טוב בצורה שאתה מפעיל את ה-VBO).

שום דבר לא "מעובד" ב-buffer. זה בסך הכל בלוק זכרון שמוקצה על הזכרון של המעבד הגרפי. העיבוד מתבצע בדיוק באותו צורה ובאותו אופן כמו ב-display lists.

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