מי עוזר לי עם openGL?

freak2100

New member
אני עדיין לא מבין מה הולך שם

מה שכן הבנתי זה שהscale למודל משפיע על התאורה, לא לגמרי ברור לי למה, והתאורה משתבשת כשהמודל קטן (ז"א, כשעושים לו הרבה scale עד שהוא קטן)
 

freak2100

New member
מי עוזר לי עם openGL?

יש לי את הקוד הבא: GLfloat ambi[] = { amb*tcol.R, amb*tcol.G, amb*tcol.B, 1.0 }; GLfloat diff[] = { dif*tcol.R, dif*tcol.G, dif*tcol.B, 1.0 }; GLfloat specu[] = { spec*1.0, spec*1.0, spec*1.0, 1.0 }; glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, ambi); glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, diff); glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, specu); glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, shine); שמגדיר את כל הפרמטרים עבור הצבע והתאורה של אובייקט. amb, dif, spec - מספרים (double) בין 0 ל1 shine - מספר (double) בין 1 ל120 tcok - איזשהו struct שמכיל את הצבע עכשיו, הכל עובד, חוץ מזה שהתאורה הדיפיוזית לא נראית כמו שצריך. לכאורה היא עובדת, אבל היא מוגזמת, וכשמשנים את shine מ1 ל120 (לדוגמה), ההבדל ממש זניח - רואים בשוליים איזשהו שינוי לא מובן, וזהו. יש לי פה openGL בגירסה 2.1.2. מה אני עושה לא נכון? תודה
 

voguemaster

New member
הייתי ממליץ לך

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

freak2100

New member
רעיון טוב...

אני והשותף שלי נשב ונשבור את הראש על השטות הזאת, בסוף נגלה מה קורה שם
תודה
 

freak2100

New member
מה קרה ל|הקוד| ו|סקוד|? ננסה שוב...

GLfloat ambi[] = { amb*tcol.R, amb*tcol.G, amb*tcol.B, 1.0 }; GLfloat diff[] = { dif*tcol.R, dif*tcol.G, dif*tcol.B, 1.0 }; GLfloat specu[] = { spec*1.0, spec*1.0, spec*1.0, 1.0 }; glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, ambi); glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, diff); glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, specu); glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, shine);​
 

somebodddy

New member
לא ממש התנסתי עם תאורה בOpenGL

אבל נראה לי שזה תלוי בעיקר בנורמלים, לא? ולגבי המבריקות - נסה להזיז את מקור האור ולראות אם יש הבדל...
 

freak2100

New member
אז מה אתה כן יודע לעשות בopenGL? ../images/Emo3.gif

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

somebodddy

New member
נכון, אבל לפחות אני לא מתכנת בפסקל

מצטער אורן... לא עולה לי בראש שום דבר יותר מתחכם...
 

voguemaster

New member
מעניין משהו

איך אתה מגדיר את מקורות האור שלך ? למיטב ידיעתי SHINE מכל סוג שהוא תלוי מאוד בכיוון של מקור האור ביחס לנורמלים של כל וורטקס. ואיך בדיוק ביצעת את החישוב של צבע ה-DIFFUSE ? אתה מכפיל שם רכיבים של צבע במשתנה שנקרא dif. מה הוא מכיל ? הייתי מציע לך לכבות SPECULAR ו-SHINE ולנסות לראות למה לא עובד לך ה-DIFFUSE.
 

freak2100

New member
אה, אופס, התכוונתי להגיד שהספקולר עושה בעיות

הדיפיוז הרי בכלל לא קשור לshininess... ככה זה כשעובדים על שמונה תרגילים בית במקצועות שונים במקביל
החישוב של הצבעים שם - אני כופל כל אחד מהרכיבים באיזשהו מספר בין 0 ל1 כדי שאני אוכל לשלוט על העוצמה של כל סוג תאורה. ככה אם אני רוצה לכבות למשל את התאורה הדיפיוזית אני משנה את הפרמטר שלה ל0, אם אני רוצה שהיא תהיה חזקה אני משנה ל1, ואני יכול לכוון אותה גם לכל ערך באמצע.
 

voguemaster

New member
בתכלס

בקוד שהראית לנו רק איתחלת את ה-MATERIAL של האובייקט, את הצבע של כל אלמנט בחומר הזה. אתה גם צריך לקחת את אחד ממקורות האור של OGL ולספק שם איזה סוג של SHADING אתה רוצה (נניח DIFFUSE ו-SPECULAR), ועוד פרמטרים. עשית את זה ?
 

freak2100

New member
אם אתה מתעקש:

glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL); glDepthMask(GL_TRUE); const static int lights[8] = {GL_LIGHT0, GL_LIGHT1, GL_LIGHT2, GL_LIGHT3, GL_LIGHT4, GL_LIGHT5, GL_LIGHT6, GL_LIGHT7}; GLfloat mat_ambient[] = { 1.0, 1.0, 1.0, 1.0 }; for (int i=0; i<8; i++){ if (m_bArrLightEnabled){ if (m_bArrLightViewspace){ glGetDoublev(GL_MODELVIEW_MATRIX, transforms_mat[activeFrame]); glLoadIdentity(); if (m_nView == ID_VIEW_PERSPECTIVE) glTranslated(0.0, 0.0, -perspective_d/2); } if (m_iArrLightType == DIRECTIONAL){ m_fArrLightDirection[0] *= -1; m_fArrLightDirection[1] *= -1; m_fArrLightDirection[2] *= -1; m_fArrLightDirection[3] = 0; glLightf(lights, GL_SPOT_CUTOFF, 180); } else if (m_iArrLightType == SPOT){ m_fArrLightDirection[3] = 1; glLightf(lights, GL_SPOT_CUTOFF, spotAngel); glLightfv(lights, GL_SPOT_DIRECTION, m_fArrSpotDir); glLightf(lights, GL_SPOT_EXPONENT, spotExponent); } else { m_fArrLightDirection[3] = 1; glLightf(lights, GL_SPOT_CUTOFF, 180); } glLightf(lights, GL_CONSTANT_ATTENUATION, attenuations[0]); glLightf(lights, GL_LINEAR_ATTENUATION, attenuations[1]); glLightf(lights, GL_QUADRATIC_ATTENUATION, attenuations[2]); glLightfv(lights, GL_POSITION, m_fArrLightDirection); m_fArrLightColor[3] = 1; lightsAmbientColor[3] = 1; glLightfv(lights, GL_AMBIENT, lightsAmbientColor); glLightfv(lights, GL_DIFFUSE, m_fArrLightColor); glLightfv(lights, GL_SPECULAR, m_fArrLightColor); glEnable(lights); if (m_iArrLightType == DIRECTIONAL){ m_fArrLightDirection[0] *= -1; m_fArrLightDirection[1] *= -1; m_fArrLightDirection[2] *= -1; } if (m_bArrLightViewspace){ if (m_nView == ID_VIEW_PERSPECTIVE) glTranslated(0.0, 0.0, perspective_d/2); glMultMatrixd(transforms_mat[activeFrame]); } } else { glDisable(lights); } } glLightModelfv(GL_LIGHT_MODEL_AMBIENT, mat_ambient); glShadeModel ((m_nLightShading == ID_LIGHT_SHADING_FLAT) ? GL_FLAT : GL_SMOOTH); glEnable(GL_LIGHTING);
 
למעלה