Transcript OpenGL

‫‪OpenGL‬‬
‫גרפיקה ממוחשבת‪ :‬מבוא ל‪OpenGL-‬‬
‫‪1‬‬
– OpenGL, GLU, GLUT
‫התקנה‬
.‫ מהאתר‬GlutInstallation.zip ‫הורידו את הקבצים‬
•
‫ אינה קיימת אז‬gl ‫ לספרייה (אם הספרייה‬GLUT.H :‫הוסיפו את הקובץ‬
:)‫צרו אותה‬
•
C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\gl\
:‫ לספריה‬GLUT32.lib ‫הוסיפו את הקובץ‬
•
C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\lib\
:‫ לספרייה‬GLUT32.dll :‫הוסיפו את הקובץ‬
•
:‫הסברים נוספים תוכלו למצוא בקישור הבא‬
•
C:\Windows\System32\
http://www.cosc.brocku.ca/Offerings/3P98/course/OpenGL/3P98Exampl
es/GettingStarted/msvcnetglut.html
2
OpenGL-‫ מבוא ל‬:‫גרפיקה ממוחשבת‬
‫)‪OpenGL (Open Graphics Library‬‬
‫• תוכנה שפותחה ע"י ‪ Silicon Graphics‬ב‪ ,1992-‬המאפשרת גישה לחומרה‬
‫הגרפית (‪.)API‬‬
‫• החומרה הגרפית מכילה יכולות גרפיות רבות‪ :‬טרנספורמציות‪ ,‬תאורה‪ ,‬חומר‪,‬‬
‫טקסטורה‪ rasterization ,z-buffer ,‬ועוד‪.‬‬
‫• מכילה כ‪ 250 -‬פקודות המאפשרות אפליקציות‪ :‬גרפיות‪,‬‬
‫אינטראקטיביות‪ ,‬תלת‪-‬ממדיות‪.‬‬
‫• ממשק בלתי תלוי בחומרה ומערכת הפעלה )‪.(cross platform‬‬
‫• אינה מכילה פקודות חלונאות או פקודות קלט מהמשתמש‪.‬‬
‫• מכילה רק אובייקטים גיאומטריים בסיסיים כגון‪ :‬נקודה‪ ,‬ישר‪ ,‬פוליגון‪.‬‬
‫גרפיקה ממוחשבת‪ :‬מבוא ל‪OpenGL-‬‬
‫‪3‬‬
‫מה ניתן לבצע באמצעות ‪OpenGL‬‬
‫‪ .1‬בנית אובייקטים תלת‪-‬ממדיים מפרמיטיבים גיאומטריים‪.‬‬
‫‪ .2‬סידור האובייקטים במרחב ובחירת נקודת מבט‪.‬‬
‫‪ .3‬הגדרת חומר‪ ,‬צבע וטקסטורה עבור האובייקטים‪.‬‬
‫‪ .4‬הגדרת תאורה‪.‬‬
‫‪ .5‬המרת המודל המתמטי לתמונה‪.‬‬
‫גרפיקה ממוחשבת‪ :‬מבוא ל‪OpenGL-‬‬
‫‪4‬‬
‫)‪GLU (OpenGL Utility Library‬‬
‫• ספריה הבנויה מעל ‪ OpenGL‬ומספקת אפשרויות גיאומטריות‬
‫מורכבות יותר‪ ,‬כגון‪ :‬עקומי ומשטחי ‪.NURBS‬‬
‫• מכילה פונקציות מעטפת לחלק מפונקציות ‪,OpenGL‬‬
‫כגון פונקציות צפייה והטלה‪.‬‬
‫גרפיקה ממוחשבת‪ :‬מבוא ל‪OpenGL-‬‬
‫‪5‬‬
‫)‪GLUT (OpenGL Utility Toolkit‬‬
‫• ערכת כלי פיתוח המאפשרת עבודה עם חלונאות למטרות גרפיקה‪.‬‬
‫• בלתי תלויה במערכת חלונאות‪.‬‬
‫• ערכה לכתיבת תוכנית הפועלת לפי מאורעות )‪.(event driven‬‬
‫• מכילה אובייקטים גיאומטריים מורכבים יותר כגון‪ :‬ספירה‪ ,‬טורוס‪,‬‬
‫וקומקום‪.‬‬
‫• מתאימה לאפליקציות קטנות המבוססות על ‪.OpenGL‬‬
‫גרפיקה ממוחשבת‪ :‬מבוא ל‪OpenGL-‬‬
‫‪6‬‬
‫‪OpenGL, GLU, GLUT‬‬
‫תוכנית גרפית‬
‫‪GLU‬‬
‫‪GLUT‬‬
‫מערכת חלונות‬
‫‪OpenGL‬‬
‫חומרה גרפית‬
‫גרפיקה ממוחשבת‪ :‬מבוא ל‪OpenGL-‬‬
‫‪7‬‬
‫מבנה כללי של תוכנית‬
main() {
initialize window
// GLUT functions
initialize drawing
// OpenGL and GLUT functions
connect between events and callbacks
// GLUT functions
update window and check for events // GLUT functions
}
)event driven( ‫זרימת התוכנית היא עפ"י מאורעות‬
8
OpenGL-‫ מבוא ל‬:‫גרפיקה ממוחשבת‬
‫תוכנית בסיסית‬
void init)void( { … // Initial definitions of the drawing }
void display)void({ … // definition of all objects to be drawn }
int main(int argc, char** argv) {
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize (250, 250);
glutInitWindowPosition (100, 100);
glutCreateWindow ("hello");
init ();
glutDisplayFunc(display);
glutMainLoop();
}
9
OpenGL-‫ מבוא ל‬:‫גרפיקה ממוחשבת‬
‫תוכנית בסיסית – אתחול חלון‬
‫•‬
‫•‬
‫•‬
‫•‬
‫•‬
‫‪ – glutInit‬אתחול ‪GLUT‬‬
‫‪ – glutInitDisplayMode‬אתחול התצוגה (מודל צבע‪ ,‬סוג החוצץ‪)...,‬‬
‫‪ – glutInitWindowSize‬אתחול גודל החלון (בפיקסלים)‬
‫‪ – glutInitWindowPosition‬אתחול מיקום החלון (ביחס לפינה השמאלית‬
‫עליונה של החלון)‬
‫‪ – glutCreateWindow‬יצירה של חלון (החלון יוצג רק אחרי הפקודה‬
‫‪)glutMainLoop‬‬
‫גרפיקה ממוחשבת‪ :‬מבוא ל‪OpenGL-‬‬
‫‪10‬‬
‫תוכנית בסיסית – מנוע ההפעלה‬
‫• ‪ – glutMainLoop‬כניסה לתהליך הרצת לולאת המאורעות‪ .‬החלונות‬
‫שהוגדרו יוצגו‪ ,‬הרינדור שנעשה יצא לפועל‪ ,‬ותהליך ההאזנה למאורעות יחל‪.‬‬
‫גרפיקה ממוחשבת‪ :‬מבוא ל‪OpenGL-‬‬
‫‪11‬‬
‫תוכנית בסיסית – קישור בין מאורעות לפונקציות‬
‫‪callback‬‬
‫•‬
‫•‬
‫•‬
‫•‬
‫•‬
‫•‬
‫‪ – glutDisplayFunc‬טיפול בצורך לצייר מחדש‪ ,‬כלומר‪ ,‬קישור לפונקצית‬
‫ציור‬
‫‪ – glutReshapeFunc‬טיפול בשינוי גודל החלון‬
‫‪ – glutKeyboardFunc‬טיפול בלחיצה על כפתור המקלדת‬
‫‪ – glutMouseFunc‬טיפול בלחיצה על כפתור העכבר‬
‫‪ – glutMotionFunc‬טיפול בתזוזת העכבר‬
‫‪ – glutIdleFunc‬טיפול במקרה שאין מאורעות‬
‫גרפיקה ממוחשבת‪ :‬מבוא ל‪OpenGL-‬‬
‫‪12‬‬
‫תוכנית בסיסית – ציור‬
void init(void) { glClearColor(0.0, 0.0, 0.0, 0.0); // Select a clear color }
void display(void) {
glClear (GL_COLOR_BUFFER_BIT); /* clear all pixels */
/* draw a white polygon (rectangle) with corners at
(0.25, 0.25, 0.0) and (0.75, 0.75, 0.0) */
glColor3f (1.0, 1.0, 1.0);
glBegin(GL_POLYGON);
glVertex3f (0.25, 0.25, 0.0);
glVertex3f (0.75, 0.25, 0.0);
glVertex3f (0.75, 0.75, 0.0);
glVertex3f (0.25, 0.75, 0.0);
glEnd();
glFlush (); /* don't wait! start processing buffered OpenGL routines */
}
13
OpenGL-‫ מבוא ל‬:‫גרפיקה ממוחשבת‬
‫תוכנית בסיסית – ציור‬
‫•‬
‫•‬
‫•‬
‫•‬
‫•‬
‫•‬
‫‪ – glClearColor‬הגדרת צבע רקע‬
‫‪ – glClear‬מחיקת החוצץ הגרפי‬
‫‪ – glColor3f‬הגדרת צבע (עבור אובייקטים שיוגדרו אחרי פקודה זו)‬
‫‪ – glEnd ,glBegin‬הגדרת אובייקט‬
‫‪ – glVertex3f‬הגדרת קודקוד של אובייקט‬
‫‪ - glFlush‬הוצאת פקודות הציור לפועל (אחרת התוכנית עלולה להמתין‬
‫לפקודות ציור נוספות)‬
‫גרפיקה ממוחשבת‪ :‬מבוא ל‪OpenGL-‬‬
‫‪14‬‬
‫תוכנית בסיסית – ציור‬
‫גרפיקה ממוחשבת‪ :‬מבוא ל‪OpenGL-‬‬
‫‪15‬‬
‫תוכנית בסיסית – מכונת מצבים‬
‫•‬
‫תוכנית ב‪ OpenGL -‬מתפקדת כמכונת מצבים‪:‬‬
‫כל פקודה מכניסה את המערכת למצב מסוים‪ .‬למשל‪ ,‬הגדרת צבע (‪)glColor3f‬‬
‫היא תקפה עד להגדרה של צבע חדש‪.‬‬
‫•‬
‫משתני מצב נוספים‪ :‬תאורה‪ ,‬חומר‪ ,‬פרמטרים של מצלמה‪ ,‬הטלה וכדומה‪.‬‬
‫•‬
‫לכל משתנה מצב יש ערך ברירת מחדל‪:‬‬
‫– קביעת ערך של משתנה מצב מתבצעת ע"י קריאה לפונקצית ‪OpenGL‬‬
‫מתאימה (מהסוג שמופיע למעלה)‬
‫– קריאת ערך של משתנה מצב נעשית ע"י הפונקציה **‪.glget‬‬
‫•‬
‫הפעלה או כיבוי של מצב‪:‬‬
‫)(‪glEnable(), glDisable‬‬
‫גרפיקה ממוחשבת‪ :‬מבוא ל‪OpenGL-‬‬
‫‪16‬‬
‫תוכנית בסיסית – פונקצית צפייה‬
‫{ )‪void winReshapeFnc (GLint newWidth,GLint newHeight‬‬
‫;)‪glMatrixMode(GL_PROJECTION‬‬
‫;)(‪glLoadIdentity‬‬
‫‪gluOrtho2D(WORLD_MIN_X,WORLD_MAX_X,‬‬
‫;)‪WORLD_MIN_Y,WORLD_MAX_Y‬‬
‫}‬
‫• ‪ – gluOrtho2D‬מגדיר הטלה דו‪-‬ממדית פשוטה (אורתוגרפית) מחלון בעולם‬
‫שמימדיו נתונים ע"י הפרמטרים המועברים לפונקציה לבין חלון המסך‪.‬‬
‫• שלוש הפקודות האלו אחראיות על הגדרת החלון בעולם שיותאם לחלון‬
‫במסך‪.‬‬
‫גרפיקה ממוחשבת‪ :‬מבוא ל‪OpenGL-‬‬
‫‪17‬‬
‫תוכנית בסיסית – אנימציה‬
.)double buffers( ‫הצגת אנימציה 'חלקה' מתבצעת ע"י חוצץ כפול‬
:‫לצורך זה צריך להוסיף ולשנות את הפקודות הבאות‬
int main(int argc, char** argv) {
:
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB); // change here
glutInitWindowSize (250, 250);
glutInitWindowPosition (100, 100);
glutCreateWindow ("hello");
:
}
void display(void)
{
:
glFlush();
glutSwapBuffers();
// add here
}
18
OpenGL-‫ מבוא ל‬:‫גרפיקה ממוחשבת‬